Python Socket客户端连接异常捕获与自动重连问题咨询
问题分析与解决方案
首先说明你遇到的OSError: [Errno 22] Invalid argument的原因:你应该是在循环外创建的sock对象,第一次连接失败后,这个socket已经处于错误状态,再次调用connect就会触发这个无效参数错误——socket对象不能重复用于连接尝试,每次重连都得新建一个实例。
针对你的问题:
- 确实需要捕获这个
OSError,或者更稳妥的是同时捕获ConnectionRefusedError和OSError(因为ConnectionRefusedError是OSError的子类,也可以直接捕获OSError覆盖所有情况)。 - 完全可以在不终止程序的情况下实现持续重连,只要调整代码逻辑,把socket的创建放到循环内部。
修正后的代码示例:
import socket import time IP = "你的服务器IP" PORT = 你的端口号 while True: # 每次循环新建一个socket实例 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect((IP, PORT)) print("成功连接到服务器") # 连接成功后跳出循环,或者在这里处理后续通信逻辑 break except ConnectionRefusedError: print("服务器未监听,5秒后重试...") time.sleep(5) except OSError as e: if e.errno == 22: print("socket状态异常,重新尝试连接...") time.sleep(5) else: print(f"发生其他网络错误: {e}") time.sleep(5) finally: # 失败时关闭当前socket,避免资源占用 sock.close()
如果想简化代码,也可以直接捕获所有OSError(涵盖连接拒绝和无效参数等情况):
import socket import time IP = "你的服务器IP" PORT = 你的端口号 while True: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect((IP, PORT)) print("连接成功!") break except OSError: print("连接失败,5秒后重试...") time.sleep(5) finally: sock.close()
这样就能实现持续尝试重连,直到服务器启动并成功建立连接,不会因为异常终止程序。
内容的提问来源于stack exchange,提问作者finnizzda
相关产品推荐
相关产品推荐

