Python websockets:客户端如何复用单个WebSocket连接访问多路由路径
WebSocket 协议在握手阶段就已经确定了连接对应的服务端路径,连接建立后所有传输的消息都不携带路径信息,因此无法直接通过send()方法指定路径向同一个服务端的不同路由发送消息。
如果要实现单连接复用,只能通过自定义消息结构的方式实现,具体方案如下:
方案1:自定义消息嵌入路由标识(推荐)
这是业界通用的单WebSocket连接做多路由分发的方案,只需前后端约定统一的消息格式即可,不需要额外建立连接。
客户端实现示例
你可以将消息封装为JSON格式,新增route字段标识目标路由,data字段存放实际业务内容:
import json import asyncio import websockets async def send_msg(): async with websockets.client.connect("ws://localhost:5005") as websocket: # 发送到/init路由的消息 await websocket.send(json.dumps({ "route": "/init", "data": {"app_version": "1.0.0", "device": "pc"} })) # 接收/init的响应 init_resp = await websocket.recv() print(f"/init 响应:{init_resp}") # 发送到/echo路由的消息 await websocket.send(json.dumps({ "route": "/echo", "data": "测试消息" })) # 接收/echo的响应 echo_resp = await websocket.recv() print(f"/echo 响应:{echo_resp}") asyncio.run(send_msg())
服务端对应修改
服务端收到消息后先解析JSON,根据route字段的值将消息转发到/init或/echo对应的处理逻辑即可,和原来单独处理两个路径的逻辑可以复用,改动量极小。
方案2:单独创建多连接(服务端无法修改时使用)
如果服务端不支持自定义消息路由,只能按路径区分请求,那么只能为每个路径单独建立WebSocket连接,无法复用同一个连接:
import asyncio import websockets async def send_msg(): # 处理/init路径的连接 async with websockets.client.connect("ws://localhost:5005/init") as ws_init: await ws_init.send("初始化请求") init_resp = await ws_init.recv() # 处理/echo路径的连接 async with websockets.client.connect("ws://localhost:5005/echo") as ws_echo: await ws_echo.send("回显请求") echo_resp = await ws_echo.recv() asyncio.run(send_msg())
内容的提问来源于stack exchange,提问作者Techie Fort
相关产品推荐
相关产品推荐

