async/await 异步编程# 同步阻塞 def function(): result blocking_operation() # 必须等待完成 return result # 异步非阻塞 async def function(): result await async_operation() # 等待但不阻塞其他任务 return result作用一个程序可以同时处理多个任务服务端可以同时处理多个客户端客户端可以同时收发消息2. WebSocket 核心 APIAPI说明示例websockets.serve(handler, host, port)启动服务端服务端使用websockets.connect(uri)连接服务端客户端使用await websocket.send(msg)发送消息双方都可用await websocket.recv()接收一条消息阻塞双方都可用async for msg in websocket持续接收消息循环双方都可用3. 通信模式对比模式特点适用场景代码示例请求-响应客户端问服务端答查询类操作simple_server.py服务端推送服务端主动发消息通知、实时数据push_server.py全双工双方随时收发聊天、游戏push_client.py4. asyncio.gather() 并发执行# 同时运行多个异步任务 await asyncio.gather( task1(), # 任务 1 task2(), # 任务 2 task3() # 任务 3 ) # 所有任务并发执行等待全部完成应用服务端同时推送消息 接收消息客户端同时接收推送 等待用户输入回到顶部实际应用场景1. 即时聊天应用# 服务端广播消息给所有客户端 connected_clients set() async def broadcast(message): await asyncio.gather( *[client.send(message) for client in connected_clients] )2. 股票行情推送# 服务端定时推送最新价格 async def push_stock_price(websocket): while True: price get_current_price() await websocket.send(json.dumps({price: price})) await asyncio.sleep(1)3. 在线游戏同步# 玩家动作同步给其他玩家 async def sync_player_action(action): for player in other_players: await player.websocket.send(action)4. 协作编辑# 用户编辑时推送给其他用户 async def on_document_change(change): for user in connected_users: await user.websocket.send(change)回到顶部HTTP vs WebSocket对比项HTTPWebSocket连接方式短连接请求-响应长连接持久化通信方向单向客户端 → 服务端双向双方互发服务端推送❌ 不支持需轮询✅ 支持实时性低轮询延迟高实时推送带宽占用高重复请求头低保持连接适用场景RESTful API、网页浏览聊天、游戏、实时数据HTTP 轮询示例低效# 客户端每秒轮询一次 while True: response requests.get(http://server/messages) if response.json()[has_new]: print(有新消息) time.sleep(1) # 浪费带宽和资源WebSocket 推送高效# 有消息时服务端主动推送 async for message in websocket: print(收到新消息:, message)回到顶部常见问题Q1: 为什么要用 async/awaitA:WebSocket 需要同时处理多个连接和消息异步编程可以高效利用资源。# 同步代码一次只能处理一个客户端 def handle_client(websocket): for message in websocket: # 阻塞在这里 send_reply(message) # 异步代码可以同时处理多个客户端 async def handle_client(websocket): async for message in websocket: # 不阻塞其他客户端 await send_reply(message)Q2: 客户端必须等待服务端回复吗A:不是必须的这取决于你的业务需求。需要等待回复查询类操作发送请求等待结果不需要等待发送日志、打点数据发完就不管同时收发聊天、游戏全双工通信Q3: WebSocket 安全吗A:WebSocket 支持加密连接wss://就像 HTTPS。# 未加密 uri ws://localhost:8765 # 加密需要 SSL 证书 uri wss://example.com:8765Q4: 如何处理断线重连async def connect_with_retry(): while True: try: async with websockets.connect(uri) as websocket: await handle_messages(websocket) except Exception as e: print(连接断开3 秒后重连...) await asyncio.sleep(3)回到顶部快速参考启动顺序# 1. 先启动服务端 python simple_server.py # 或 push_server.py # 2. 再启动客户端 python simple_client.py # 或 push_client.py修改推送间隔# push_server.py 第 31 行 await asyncio.sleep(3) # 改成 1 就是 1 秒推送一次修改端口# 服务端 websockets.serve(handle_client, localhost, 8765) # 改端口 # 客户端 uri ws://localhost:8765 # 改成对应端口回到顶部总结通过这两个示例你已经掌握了✅ WebSocket 的基本原理✅ 客户端发送、服务端响应simple✅ 服务端主动推送push✅ 全双工通信同时收发✅ 异步编程的核心概念