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

Python WebSocket服务器响应后自动关闭连接的问题排查

Python WebSocket服务器响应后自动关闭连接的问题排查

我来帮你梳理这个问题——你的WebSocket连接每次处理完请求就自动关闭,核心原因出在你定义的hello处理函数逻辑上,咱们一步步拆解解决:

问题根源:单次请求处理后函数结束,触发连接关闭

你使用的websockets库有个默认行为:当你编写的连接处理函数(也就是hello)执行完毕时,会自动关闭对应的WebSocket连接。这和你之前用的Node.js WebSocket库逻辑不一样,Node.js的很多实现会默认维持连接,直到主动调用关闭方法。

看你当前的hello函数:

async def hello(websocket, path):
    global gg_hashmap
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    json_data = await websocket.recv()
    obj = json.loads(json_data)
    #print(obj, flush=True)
    if ("l" in obj and obj["l"]=='license'):
        res = {
            'status': 1,
            'python': 1,
        }
        json_string = json.dumps(res)
        await websocket.send(json.dumps(json_string))
    else:
        print("In else pat")

它只做了**接收一次消息→处理→发送响应(如果是license请求)**这一套流程,然后函数就结束了,websockets库自然会关闭这个连接。

解决方案:让处理函数持续运行,保持连接

要让连接一直保持,你需要把处理逻辑放到一个循环里,让函数持续监听客户端的新消息,直到主动关闭连接。修改后的hello函数示例:

async def hello(websocket, path):
    global gg_hashmap
    print(datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
    try:
        # 用无限循环保持连接,持续接收客户端的消息
        while True:
            json_data = await websocket.recv()
            obj = json.loads(json_data)
            #print(obj, flush=True)
            if ("l" in obj and obj["l"]=='license'):
                res = {
                    'status': 1,
                    'python': 1,
                }
                # 修正原代码双重序列化的问题
                await websocket.send(json.dumps(res))
            else:
                print("In else pat")
                # 这里可以添加其他请求类型的处理逻辑,比如发送对应的响应
    except websockets.exceptions.ConnectionClosed:
        # 捕获客户端主动关闭连接的异常,优雅处理
        print(f"客户端连接已关闭:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")

额外优化点:避免闲置连接被误关

另外,你可以在启动服务器时配置心跳参数,防止因为网络闲置导致连接被自动关闭:

start_server = websockets.serve(
    hello, ip, 31334, ssl=ssl_context, 
    ping_interval=30,  # 每隔30秒发送一次ping包
    ping_timeout=60    # 60秒没收到pong就关闭连接
)

其他排查方向

如果修改后还是有问题,可以检查这几点:

  • 客户端代码有没有主动关闭连接的逻辑,有时候可能是客户端收到响应后主动断开了;
  • 浏览器控制台有没有报错,比如SSL证书的警告(虽然你用了自签名证书,但部分浏览器可能在验证不通过时悄悄关闭连接)。

备注:内容来源于stack exchange,提问作者user5858

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 14:25:28