You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 22:27:29