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
相关产品推荐
相关产品推荐

