Python WebSocket
WebSocket 简介
WebSocket 是一种网络传输协议,提供了在客户端和服务器之间建立持久连接的全双工通信通道。与传统的 HTTP 请求-响应模型不同,WebSocket 允许服务器主动向客户端推送数据,非常适合需要实时更新的应用场景。
WebSocket 与 HTTP 的区别
特点对比
- HTTP:无状态、短连接、只能客户端发起
- WebSocket:有状态、长连接、客户端和服务器均可主动发送数据
Python WebSocket 库介绍
Python 有多个库可用于实现 WebSocket 通信,最常用的包括:
- websockets - 纯 Python 实现,基于 asyncio
- websocket-client - 用于客户端应用
- Flask-SocketIO - 基于 Flask 框架的 WebSocket 实现
- Django Channels - Django 框架中的 WebSocket 支持
本教程将主要使用 websockets
库,因为它设计简洁且易于使用。
安装 WebSocket 库
首先,让我们安装 websockets
库:
pip install websockets
创建简单的 WebSocket 服务器
让我们创建一个基本的 WebSocket 服务器,它能够接收客户端消息并返回响应:
import asyncio
import websockets
# 处理客户端连接的函数
async def echo(websocket):
async for message in websocket:
print(f"收到消息: {message}")
# 将消息回显给客户端
await websocket.send(f"服务器收到: {message}")
# 启动WebSocket服务器
async def main():
async with websockets.serve(echo, "localhost", 8765):
print("WebSocket 服务器已启动,监听端口 8765...")
await asyncio.Future() # 运行服务器直到被手动关闭
if __name__ == "__main__":
asyncio.run(main())
保存为 websocket_server.py
并运行。服务器将在本地 8765 端口上启动,等待客户端连接。
创建 WebSocket 客户端
现在我们创建一个客户端来连接到上面的服务器:
import asyncio
import websockets
async def hello():
# 连接到服务器
async with websockets.connect("ws://localhost:8765") as websocket:
# 发送消息
await websocket.send("你好,WebSocket!")
# 接收服务器响应
response = await websocket.recv()
print(f"服务器响应: {response}")
if __name__ == "__main__":
asyncio.run(hello())
保存为 websocket_client.py
。首先运行服务器,然后在另一个终端中运行客户端。
服务器输出:
WebSocket 服务器已启动,监听端口 8765...
收到消息: 你好,WebSocket!
客户端输出:
服务器响应: 服务器收到: 你好,WebSocket!
WebSocket 连接生命周期
WebSocket 连接有以下几个阶段:
- 建立连接 - 客户端发送 HTTP 握手请求,服务器响应
- 数据传输 - 双方可以随时发送消息
- 关闭连接 - 任何一方都可以发起关闭连接
握手
WebSocket 连接始于一个 HTTP 请求,该请求包含特殊的头部字段,表明客户端希望升级为 WebSocket 连接。服务器接受后,连接就升级为持久的 WebSocket 连接。