我正在尝试学习如何使用 Python 中的套接字在两台计算机之间进行通信。不幸的是,当一切似乎都正确时,我收到了此错误:
OSError: [Errno 107] Transport endpoint is not connected
经过谷歌搜索,我发现这可能是因为连接断开了。但我在同一台机器上同时运行该程序的客户端和服务器端。我尝试从客户端再次连接,结果如下:
OSError: [Errno 106] Transport endpoint is already connected
表示之前的连接仍然完好无损。我对发生了什么以及如何使其工作感到很困惑。以下是屏幕截图,显示了我正在尝试做的事情和问题:
出现 OSError: [Errno 107] Transport endpoint is not connected 和 OSError: [Errno 106] Transport endpoint is already connected 这样的错误,通常表示套接字的连接状态出了问题。这可能与以下几个原因有关:
在套接字通信中,服务器端需要先创建监听套接字,等待客户端连接;客户端随后发起连接。任何一方在连接之前尝试发送或接收数据都会导致错误。
当一个套接字被关闭或被设置成不可重用时,重新尝试连接可能导致 Errno 106 或 Errno 107。确保在尝试新连接之前,所有相关的套接字都已正确关闭。
Errno 106
Errno 107
以下是一个简单的 Python 套接字通信示例,包括服务器端和客户端代码。请确保运行服务器代码后再运行客户端代码。
import socket # 创建服务器套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 12345)) # 绑定地址和端口 server_socket.listen(1) # 设置监听连接的数量 print("等待客户端连接...") conn, addr = server_socket.accept() # 等待客户端连接 print(f"连接到客户端 {addr}") try: # 接收来自客户端的消息 data = conn.recv(1024).decode('utf-8') print(f"来自客户端的消息: {data}") # 发送响应到客户端 conn.send("Hello from server!".encode('utf-8')) finally: # 关闭连接 conn.close() server_socket.close()
import socket # 创建客户端套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('localhost', 12345)) # 连接服务器 try: # 发送消息到服务器 client_socket.send("Hello from client!".encode('utf-8')) # 接收来自服务器的响应 data = client_socket.recv(1024).decode('utf-8') print(f"来自服务器的消息: {data}") finally: # 关闭连接 client_socket.close()
连接顺序:先启动服务器端代码,再启动客户端代码。客户端会自动连接到服务器。
错误处理:确保使用 try...finally 或 with 语句来正确关闭连接,以避免资源泄露。
try...finally
with
端口占用问题:如果你重新运行代码,可能会遇到端口被占用的问题。可以通过设置套接字的 SO_REUSEADDR 选项来避免这个问题: python server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
SO_REUSEADDR
python server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
希望这可以解决你的问题,如果错误依旧,可能还需要进一步检查网络配置或者防火墙设置。