Python WebSocket连接数秒后自动断开问题求助
解决WebSocket连接20秒后断开的问题
以下是几个针对性的排查和解决方向:
验证Ping包的有效性
你当前使用自定义JSON格式的ping消息,但要确认API是否要求客户端处理服务端返回的pong响应,或者该ping格式是否完全符合官方规范。部分服务端会判定无响应的ping为无效交互,进而断开连接。可以在消息监听逻辑中加入pong处理:def listen_messages(ws): while True: raw_msg = ws.recv() if not raw_msg: continue msg = json.loads(raw_msg) if msg.get("command") == "pong": print("Pong received, connection active") # 处理业务数据逻辑调整WebSocket连接参数
初始化代码中的receive_limit_ms设置为1小时,但服务端可能有自己的连接超时阈值(比如20秒)。尝试添加timeout参数,并确保ping间隔小于服务端超时时间:def initialize(url): ws = websocket.WebSocket() ws.connect(url, receive_limit_ms=3600*1000, timeout=60) return ws部分WebSocket库默认超时较短,显式设置更长的超时时间可能避免被动断开。
改用标准WebSocket Ping/Pong
目前你发送的是自定义JSON ping,试试使用WebSocket协议层的标准ping方法,这种方式更易被服务端和网络中间件识别为活跃连接:def send_ping(ws): print("Sending standard WebSocket ping") ws.ping()同时可以监听标准pong帧,确认连接状态:
def listen_messages(ws): while True: msg = ws.recv() if msg is None: # 处理断开逻辑 break if isinstance(msg, bytes) and msg == b'': # 收到标准pong帧 print("Standard pong received") else: # 处理业务JSON消息 data = json.loads(msg) # ...排查网络中间件限制
部分防火墙、代理服务器会主动断开20秒左右的“空闲”连接,自定义JSON消息可能不被识别为活跃流量。改用标准WebSocket Ping/Pong通常能解决这类问题,因为协议层的帧会被中间件判定为有效连接活动。优化重连策略(若需保留)
如果上述方法都无法避免断开,优化重连逻辑以减少开销:重连时复用原sessionId(API允许的情况下),无需重新登录,直接发送订阅命令恢复数据接收:def reconnect(url, existing_session_id): ws = initialize(url) # 复用sessionId重新订阅 ws.send(json.dumps({ "command": "subscribe", "streamSessionId": existing_session_id, # 原订阅参数 })) return ws
内容的提问来源于stack exchange,提问作者Luboš Hájek
相关产品推荐
相关产品推荐

