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
相关产品推荐
相关产品推荐

