Python3 网络编程7:WebSocket 编程(双向实时通信)
在传统 HTTP 请求-响应模式下,客户端需要不断轮询服务器以获取最新数据。而 WebSocket 允许服务器和客户端建立全双工通信,适用于实时聊天、在线游戏、股票行情等场景。
7.1 WebSocket 基础
Python 提供了 websockets 库,支持 WebSocket 通信。
7.1.1 安装 websockets
pip install websockets
7.1.2 WebSocket 通信流程
- 客户端发送连接请求
- 服务器响应连接
- 双向通信
- 任意一方可主动断开连接
7.2 WebSocket 服务器
我们使用 websockets 库创建一个 WebSocket 服务器,监听 0.0.0.0:8765 端口。
import asyncio
import websockets
async def websocket_server(websocket, path):
print("客户端已连接")
try:
async for message in websocket:
print(f"收到消息: {message}")
await websocket.send(f"服务器收到: {message}")
except websockets.exceptions.ConnectionClosed:
print("客户端断开连接")
start_server = websockets.serve(websocket_server, "0.0.0.0", 8765)
asyncio.run(start_server)
7.3 WebSocket 客户端
import asyncio
import websockets
async def websocket_client():
async with websockets.connect("ws://127.0.0.1:8765") as websocket:
await websocket.send("Hello WebSocket Server!")
response = await websocket.recv()
print(f"收到服务器响应: {response}")
asyncio.run(websocket_client())
7.4 WebSocket 多客户端支持
7.4.1 服务器支持多个客户端
import asyncio
import websockets
clients = set()
async def websocket_handler(websocket, path):
clients.add(websocket)
try:
async for message in websocket:
print(f"收到消息: {message}")
for client in clients:
if client != websocket:
await client.send(f"广播消息: {message}")
except websockets.exceptions.ConnectionClosed:
pass
finally:
clients.remove(websocket)
start_server = websockets.serve(websocket_handler, "0.0.0.0", 8765)
asyncio.run(start_server)
7.4.2 客户端连接多个 WebSocket
import asyncio
import websockets
async def websocket_client(name):
async with websockets.connect("ws://127.0.0.1:8765") as websocket:
await websocket.send(f"{name} 连接成功")
while True:
response = await websocket.recv()
print(f"{name} 收到消息: {response}")
async def main():
await asyncio.gather(websocket_client("客户端1"), websocket_client("客户端2"))
asyncio.run(main())
7.5 WebSocket 与浏览器通信
可以在前端 HTML 页面中使用 WebSocket 连接服务器。
7.5.1 前端 WebSocket 代码
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>WebSocket 客户端</title>
</head>
<body>
<h2>WebSocket 连接</h2>
<button onclick="sendMessage()">发送消息</button>
<script>
let ws = new WebSocket("ws://localhost:8765");
ws.onopen = function () {
console.log("连接成功!");
};
ws.onmessage = function (event) {
console.log("收到消息: " + event.data);
};
function sendMessage() {
ws.send("Hello from Web!");
}
</script>
</body>
</html>
下篇文章我们将介绍 Twisted,用于更高级的网络编程,如 Telnet 服务器!