You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:54:04