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

Python socket连接报OSError: [Errno 22] Invalid argument错误

报错根本原因

触发OSError: [Errno 22] Invalid argument的核心原因是混淆了TCP客户端和服务端的API调用逻辑:

  • TCP服务端的固定流程是:创建socket -> bind()绑定端口 -> listen()开启监听 -> accept()等待客户端连接
  • TCP客户端的固定流程是:创建socket -> connect()主动连接服务端
    你在同一个socket对象上先调用bind(("localhost", 8000))把socket绑定到本地8000端口,紧接着又调用connect(("localhost", 8000))让这个socket连接自己的8000端口,属于矛盾操作,系统直接返回无效参数错误。

除此之外你的代码还存在其他逻辑问题,会导致后续运行报错:

  • connect_client方法里引用的threads变量是start_client内的局部变量,跨方法访问会触发未定义错误
  • connect_client中实例化ClientServer("localhost", 8000)时传了参数,但类的__init__方法没有定义接收这两个入参,会触发参数不匹配错误
  • newthread.start缺少括号,实际不会启动子线程
  • 类继承了Thread但没有实现线程执行的run()方法,线程启动后没有实际执行逻辑
  • connect_client内是while True死循环,代码执行到这里会永久阻塞,后续的send_to_Server、receive_from_Server永远不会被执行
修复方案

如果你要实现的是连接到现有8000端口服务端的TCP客户端,直接删掉冗余的服务端逻辑即可,修正后的可运行代码如下:

import socket
from threading import Thread

MAX_BUFFER_SIZE = 4096

class TCPClient(Thread):
    def __init__(self, server_host="localhost", server_port=8000):
        super().__init__()
        self.server_host = server_host
        self.server_port = server_port
        self.socket = None
        print("TCP Client initialized")

    def start_client(self):
        # 创建TCP流socket
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 客户端不需要手动bind端口,操作系统会自动分配可用临时端口
        self.socket.connect((self.server_host, self.server_port))
        print("Connected to target server successfully")

    def send_to_server(self, data):
        print(f"Sending data to server: {data}")
        self.socket.send(data.encode("utf8"))   

    def receive_from_server(self):
        print("Waiting for server response...")
        result_bytes = self.socket.recv(MAX_BUFFER_SIZE)
        result_string = result_bytes.decode("utf8")
        print(f"Server response: {result_string}")
        return result_string

    def run(self):
        # 子线程常驻,异步接收服务端主动推送的消息
        while True:
            try:
                data = self.socket.recv(MAX_BUFFER_SIZE)
                if not data:
                    print("Server closed connection")
                    break
                print(f"Async message from server: {data.decode('utf8')}")
            except Exception as e:
                print(f"Connection error: {e}")
                break

if __name__ == "__main__":
    # 运行前请确保已经有TCP服务端监听localhost:8000端口
    client = TCPClient()
    client.start_client()
    # 启动异步接收线程
    client.start()
    # 测试收发
    client.send_to_server("Hello")
    client.receive_from_server()

如果你实际要实现的是TCP服务端,需要完全移除connect()调用,按照bind->listen->accept的流程编写逻辑,每个接入的客户端连接单独分配线程处理收发即可。

内容的提问来源于stack exchange,提问作者user17554243

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:33:22