Socket.IO树莓派5连接频繁断开进入重连循环问题求助
Socket.IO树莓派5连接反复断开重连问题求助
问题背景
我正在开展一个项目,使用Socket.IO在外部服务器与树莓派5之间建立低延迟连接。该树莓派同时作为客户端和中继服务器的宿主。连接能正常运行一段时间,但随后会进入断开重连循环。
故障表现日志
INFO:socketio.client:Connection failed, new attempt in 5.01 seconds INFO:geventwebsocket.handler:192.168.1.103 - - [2024-08-20 10:26:38] "GET /socket.io/?transport=polling&EIO=4&sid=BlFj5QtkLH1eZUyYAAAF&t=1724145973.7493463 HTTP/1.1" 200 157 25.001898 DEBUG:geventwebsocket.handler:Initializing WebSocket DEBUG:geventwebsocket.handler:Validating WebSocket request DEBUG:geventwebsocket.handler:Can only upgrade connection if using GET method. INFO:geventwebsocket.handler:192.168.1.103 - - [2024-08-20 10:26:38] "POST /socket.io/?transport=polling&EIO=4&sid=BlFj5QtkLH1eZUyYAAAF HTTP/1.1" 200 143 0.000526 DEBUG:geventwebsocket.handler:Initializing WebSocket DEBUG:geventwebsocket.handler:Validating WebSocket request Connection failed, new attempt in 5.46 seconds INFO:socketio.client:Connection failed, new attempt in 5.46 seconds Connection failed, new attempt in 4.57 seconds INFO:socketio.client:Connection failed, new attempt in 4.57 seconds Received packet PING data INFO:engineio.client:Received packet PING data Sending packet PONG data INFO:engineio.client:Sending packet PONG data Connection failed, new attempt in 4.92 seconds INFO:socketio.client:Connection failed, new attempt in 4.92 seconds Connection failed, new attempt in 5.00 seconds INFO:socketio.client:Connection failed, new attempt in 5.00 seconds Connection failed, new attempt in 4.62 seconds INFO:socketio.client:Connection failed, new attempt in 4.62 seconds .... INFO:socketio.client:Connection failed, new attempt in 5.04 seconds Received packet PING data INFO:engineio.client:Received packet PING data Sending packet PONG data INFO:engineio.client:Sending packet PONG data WebSocket connection was closed, aborting WARNING:engineio.client:WebSocket connection was closed, aborting Waiting for write loop task to end INFO:engineio.client:Waiting for write loop task to end Exiting write loop task INFO:engineio.client:Exiting write loop task Engine.IO connection dropped INFO:socketio.client:Engine.IO connection dropped 2024-08-20 10:29:18,487 INFO: Disconnected from external server DEBUG:urllib3.connectionpool:Starting new HTTPS connection (1): [Url hidden for security] DEBUG:urllib3.connectionpool: [Url hidden for security] HTTP/1.1" 200 20 INFO:__main__:Disconnected from external server 2024-08-20 10:29:18,984 INFO: Already connected to external server. Skipping reconnection.
当前连接与重连处理代码
def connect_to_external_server(): global failure_count connected = False while not connected: try: if not sio.connected: logger.info(f"Connecting to external server at {EXTERNAL_SERVER_URL}...") sio.connect(EXTERNAL_SERVER_URL, transports=['websocket']) connected = True logger.info("Successfully connected to external server.") else: logger.info("Already connected to external server. Skipping reconnection.") connected = True except socketio.exceptions.ConnectionError as e: logger.error(f"Connection to external server failed: {e}. Retrying...") failure_count += 1 if failure_count >= max_failures: logger.error(f"Maximum connection failures reached. Restarting script...") os.execv(sys.executable, [sys.executable] + sys.argv) sleep_time = min(30, 5 * 2 ** (failure_count - 1)) + random.uniform(0, 1) logger.info(f"Retrying in {sleep_time} seconds...") time.sleep(sleep_time) # Event handlers for the external server @sio.event def connect(): logger.info('Connected to external server') @sio.event def disconnect(): logger.info('Disconnected from external server') connect_to_external_server()
求助问题
- 有没有人遇到过类似问题?
- 能否分析该重连循环的原因?
- 欢迎提供提升连接稳定性的建议。
我尝试过自动重启脚本,虽然有效,但这并非理想方案,因为需要处理大量请求。
问题分析与解决建议
可能的原因
- WebSocket升级失败:日志中出现
Can only upgrade connection if using GET method,说明从polling协议升级到WebSocket时出现方法不匹配问题,大概率是客户端与服务器的Socket.IO/Engine.IO版本不兼容,或是服务器端WebSocket路由配置错误。 - 双重重连逻辑冲突:Socket.IO客户端默认开启自动重连机制,而你又在
disconnect事件中手动触发connect_to_external_server,两种重连逻辑互相干扰,导致循环重连。 - 网络与资源问题:树莓派所在网络可能存在间歇性丢包、NAT超时;或是长时间运行后出现内存泄漏、文件句柄耗尽,导致连接无法正常建立。
- Ping/Pong超时不匹配:客户端与服务器的ping间隔、超时设置不一致,导致服务器判定客户端离线主动断开连接。
优化建议
- 统一重连逻辑:初始化Socket.IO客户端时禁用自动重连,避免与手动逻辑冲突:
sio = socketio.Client(reconnection=False) - 修复WebSocket升级问题:
- 检查客户端与服务器的Socket.IO、Engine.IO版本,确保完全匹配;
- 修改连接代码,允许polling作为备选传输方式:
sio.connect(EXTERNAL_SERVER_URL, transports=['websocket', 'polling'])
- 重置失败计数:在连接成功时重置
failure_count,避免后续重连使用过长的退避时间:@sio.event def connect(): logger.info('Connected to external server') global failure_count failure_count = 0 - 监控系统资源:在树莓派上定期监控内存、CPU占用情况,排查是否存在资源泄漏;添加连接断开时的资源清理逻辑。
- 检查服务器端配置:确认外部服务器的Socket.IO连接超时、ping/pong间隔设置,避免因超时时间过短误判客户端离线。
内容的提问来源于stack exchange,提问作者dsh33
相关产品推荐
相关产品推荐

