Back to Blogs
websocket
web

Websocket 技术

Soloman
2020-12-18

Websocket 技术

WebSocket技术是一种基于TCP协议的全双工通信协议,允许客户端和服务器之间在单个连接上进行双向实时数据传输。这种通信方式相比传统的HTTP请求-响应模式具有更低的延迟、更高的效率,并且能够持续保持连接状态,从而减少资源消耗和网络开销。

1 WebSocket技术原理

  1. 握手阶段:WebSocket通信开始于客户端向服务器发送一个特殊的HTTP请求(称为WebSocket握手)。该请求包含一个Upgrade头,值为websocket,表明客户端希望将协议升级为WebSocket协议。服务器响应时会返回一个状态码101,表示协议升级成功。
  2. 连接建立:握手成功后,客户端和服务器通过WebSocket协议建立持久连接。此后,双方可以随时发送数据,而无需重新建立连接。
  3. 数据传输:WebSocket连接建立后,客户端和服务器可以通过该连接进行双向数据传输。WebSocket协议支持二进制和文本格式的数据传输,且支持压缩和心跳机制以维持连接稳定性。
  4. 关闭连接:WebSocket连接可以通过发送特定的消息来关闭。客户端或服务器可以主动发送关闭帧来终止连接。

2 WebSocket在Python中的实现

Python中实现WebSocket主要依赖于websockets库,该库提供了丰富的API来创建WebSocket服务器和客户端。以下是具体实现步骤:

1. 安装websockets

使用pip安装websockets库:

pip install websockets

2. 创建WebSocket服务器

以下是一个简单的WebSocket服务器示例:

import asyncio
import websockets

async def echo(websocket, path):
    async for message in websocket:
        await websocket.send(message)

start_server = websockets.serve(echo, "localhost", 8765)

asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

该代码创建了一个监听本地8765端口的WebSocket服务器,每当收到消息时,它会原样返回接收到的消息。

3. 创建WebSocket客户端

客户端代码如下:

import asyncio
import websockets

async def connect():
    async with websockets.connect('ws://localhost:8765') as websocket:
        await websocket.send("Hello, WebSocket!")
        response = await websocket.recv()
        print(f"Received: {response}")

asyncio.get_event_loop().run_until_complete(connect())

该代码连接到上述服务器,并发送消息“Hello, WebSocket!”,然后接收并打印服务器的响应。

4. 异步编程与asyncio

Python中的WebSocket开发通常结合asyncio库使用,以实现异步操作。例如,可以利用asyncio Transport来处理并发连接。

5. 处理WebSocket事件

WebSocket连接中常见的事件包括:

  • open: 连接成功建立时触发。
  • message: 收到消息时触发。
  • close: 连接关闭时触发。
  • error: 发生错误时触发。

以下是处理这些事件的示例代码:

async def handle_connection(websocket, path):
    try:
        await websocket.accept()
        async for message in websocket:
            print(f"Received: {message}")
            await websocket.send(f"Echo: {message}")
    except Exception as e:
        print(f"Error: {e}")
    finally:
        await websocket.close()

start_server = websockets.serve(handle_connection, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

该代码在连接建立后接收消息并回显,同时捕获异常并优雅地关闭连接。

3 WebSocket的应用场景

WebSocket广泛应用于需要实时通信的场景,如:

  • 在线游戏:实时更新玩家状态。
  • 实时聊天:用户之间的即时消息传递。
  • 实时数据更新:股票行情、新闻推送等。

4 总结

WebSocket技术通过持久连接实现了高效的数据传输,Python中的websockets库为开发者提供了强大的支持。无论是简单的聊天应用还是复杂的游戏系统,都可以利用WebSocket技术实现低延迟、高效率的实时通信功能。

WebSocket握手阶段的具体过程如下:

  1. 客户端发送握手请求:客户端向服务器发送一个HTTP请求,请求协议升级至WebSocket。请求头中包含以下特殊头部信息:
    • Upgrade: websocket:表示请求将协议升级为WebSocket。
    • Connection: Upgrade:表示此连接将被升级。
    • Sec-WebSocket-Key:一个用于生成随机密钥的参数。
    • Sec-WebSocket-Version:指定WebSocket协议的版本。
  2. 服务器响应握手请求:服务器接收到握手请求后,验证请求头中的信息是否符合WebSocket协议的要求。如果验证通过,服务器会返回一个HTTP 101状态码(Switching Protocols)的响应,表示协议切换成功。响应头中包含以下信息:
    • Upgrade: websocket:确认协议升级为WebSocket。
    • Connection: Upgrade:确认连接将被升级。
    • Sec-WebSocket-Accept:服务器生成的随机密钥,用于后续的数据加密传输。
  3. 握手完成:客户端接收到服务器的响应后,确认响应中的Sec-WebSocket-Accept参数是否正确。如果验证通过,握手过程完成,WebSocket连接建立成功。此时,客户端和服务器之间将保持一个持久的TCP连接,可以随时进行数据传输。