Python TCP通信出现WinError 10053连接中断报错如何排查解决?
报错诱因
- 服务端逻辑缺陷:
socketserver.TCPServer默认会在handle()方法执行结束后自动关闭当前客户端的TCP连接。你当前的服务端handle方法仅完成1次消息接收、1次响应回发就执行完毕,直接主动断开了和客户端的连接。 - 客户端逻辑缺陷:客户端接收线程是死循环持续调用
sock.recv()读取套接字数据,没有处理连接断开的场景,当服务端关闭连接后仍尝试从已失效的套接字读取数据,就触发了ConnectionAbortedError: [WinError 10053]报错。
修复方案
1. 服务端修改
调整handle方法逻辑,增加循环持续处理同一客户端的多次消息请求,不要处理一次就退出:
import socketserver class TCPHandler(socketserver.BaseRequestHandler): def handle(self): # 循环处理同个客户端的多次消息 while True: self.data = self.request.recv(1024) # recv返回空字节说明客户端已主动断开连接,退出循环释放连接 if not self.data: break print(self.data.decode("UTF-8").strip()) # 回发响应 self.request.sendall(self.data) if __name__ == "__main__": HOST, PORT = "localhost", 9999 # 开启端口复用,避免重启服务时出现端口占用报错 socketserver.TCPServer.allow_reuse_address = True with socketserver.TCPServer((HOST, PORT), TCPHandler) as server: server.serve_forever()
如果需要同时支持多个客户端连接,把代码中的TCPServer替换为socketserver.ThreadingTCPServer即可,其余逻辑无需改动。
2. 客户端修改
调整接收函数逻辑,增加连接异常、连接断开的判断与处理逻辑,避免出现未捕获的报错:
def recieve(): while True: try: received = sock.recv(1024) # 空字节说明服务端已断开连接 if not received: print("与服务端的连接已断开") sock.close() break received = received.decode("UTF-8") print(received) except (ConnectionAbortedError, ConnectionResetError, OSError): print("连接异常中断,程序即将退出") sock.close() break
内容的提问来源于stack exchange,提问作者Craze XD
相关产品推荐
相关产品推荐

