如何使用异步定时器解决Python Socket服务端挂起问题
Python Socket服务端超时重连实现
针对Android客户端后台失联导致服务端挂起的问题,直接用异步定时器+超时断开重连的方案实现,以下是可运行的Python代码:
import socket import threading # 全局变量:控制定时器与客户端连接 timer = None client_socket = None TIMEOUT_SECONDS = 60 def reset_timer(): """重置超时定时器""" global timer if timer is not None: timer.cancel() # 重新启动60秒定时器,超时后执行断开逻辑 timer = threading.Timer(TIMEOUT_SECONDS, handle_timeout) timer.start() def handle_timeout(): """超时处理:发送终止消息并重启监听""" global client_socket try: if client_socket: client_socket.sendall(b"TerminatingMessage") client_socket.close() print("客户端超时,已终止连接") except Exception as e: print(f"超时处理异常: {e}") finally: client_socket = None OpenSocket() def OpenSocket(): """启动Socket服务端,等待客户端连接""" global client_socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定本地IP和端口,根据实际情况修改 server_socket.bind(("0.0.0.0", 12345)) server_socket.listen(1) print("等待客户端连接...") try: client_socket, addr = server_socket.accept() print(f"客户端 {addr} 已连接") server_socket.close() # 关闭监听socket,专注处理当前连接 # 通信循环 while True: # 发送业务消息,替换成你的实际内容 message = b"Hello from server" client_socket.sendall(message) print("已发送消息给客户端") # 启动/重置超时定时器 reset_timer() # 接收客户端回复 try: recv_data = client_socket.recv(1024) if not recv_data: print("客户端主动断开连接") break # 处理收到的消息,添加你的业务逻辑 print(f"收到客户端消息: {recv_data.decode('utf-8')}") except Exception as e: print(f"接收消息异常: {e}") break except Exception as e: print(f"服务端异常: {e}") finally: if client_socket: client_socket.close() # 重启监听 OpenSocket() if __name__ == "__main__": OpenSocket()
关键逻辑说明
- 定时器重置:每次发送消息后调用
reset_timer(),刷新60秒超时窗口;收到客户端回复时也会重置定时器,确保连接存活。 - 超时断开:60秒未收到回复时,自动发送终止消息、关闭当前连接,然后重启服务端监听新连接。
- 异常防护:捕获客户端主动断开、通信异常等场景,避免服务端崩溃。
使用注意
- 修改绑定的IP和端口为你实际使用的配置。
- 替换发送的消息内容为你的业务数据。
- 在消息处理区域添加对应的业务逻辑。
内容的提问来源于stack exchange,提问作者user1530405
相关产品推荐
相关产品推荐

