如何在本地Flask服务器的Python程序中开启两个WebSocket连接?
在Python中建立两个WebSocket连接的方法
不需要同时导入多个WebSocket库,选一个适配你场景的库就能搞定。下面分客户端和服务端两种场景说明:
场景1:作为客户端同时建立两个连接
推荐用websockets库(异步实现,天生适合并发处理多个连接)。
- 先安装库:
pip install websockets
- 示例代码:
import asyncio import websockets async def single_ws_connection(url): async with websockets.connect(url) as ws: # 这里可以添加消息收发逻辑 await ws.send("Hi from client!") reply = await ws.recv() print(f"来自 {url} 的回复: {reply}") # 如需保持连接,可在此处添加循环监听消息 async def main(): # 替换成你要连接的两个WebSocket服务地址 ws_addr1 = "wss://echo.websocket.org" ws_addr2 = "wss://your-second-ws-server.com" # 并发执行两个连接任务 await asyncio.gather( single_ws_connection(ws_addr1), single_ws_connection(ws_addr2) ) if __name__ == "__main__": asyncio.run(main())
这段代码用asyncio.gather同时启动两个连接协程,每个连接独立处理自己的消息交互,全程只用到websockets一个库。
场景2:作为服务端同时处理两个客户端连接
如果是基于Flask开发服务端,用flask-sock最省心;如果偏好纯异步服务,继续用websockets也可以。
用flask-sock实现
- 安装库:
pip install flask-sock
- 示例代码:
from flask import Flask from flask_sock import Sock app = Flask(__name__) sock = Sock(app) # 每个客户端连接进来时,都会触发这个函数 @sock.route('/ws') def handle_ws_connection(ws): while True: msg = ws.receive() if not msg: break ws.send(f"已收到你的消息: {msg}") if __name__ == "__main__": # 开发环境直接run,生产环境建议用gunicorn等WSGI服务器 app.run(debug=True)
当有两个客户端连接ws://localhost:5000/ws时,服务端会为每个连接创建独立的处理实例,自动支持并发,不需要额外配置。
用websockets实现异步服务
import asyncio import websockets async def handle_client(ws): # 循环监听当前客户端的消息 async for msg in ws: await ws.send(f"回声: {msg}") async def main(): # 启动服务,监听本地8765端口 async with websockets.serve(handle_client, "localhost", 8765): await asyncio.Future() # 保持服务持续运行 if __name__ == "__main__": asyncio.run(main())
这个服务可以同时接收N个客户端连接,每个连接的消息都由handle_client独立处理。
库的选择建议
- 做客户端:优先选
websockets,异步特性处理多连接更高效; - 做服务端:如果已经在用Flask,选
flask-sock无缝集成;否则用websockets做纯异步服务更轻量。
内容的提问来源于stack exchange,提问作者Carter Hugill
相关产品推荐
相关产品推荐

