小能豆

OSError: [Errno 107] Transport endpoint is not connected

py

我正在尝试学习如何使用 Python 中的套接字在两台计算机之间进行通信。不幸的是,当一切似乎都正确时,我收到了此错误:

OSError: [Errno 107] Transport endpoint is not connected

经过谷歌搜索,我发现这可能是因为连接断开了。但我在同一台机器上同时运行该程序的客户端和服务器端。我尝试从客户端再次连接,结果如下:

OSError: [Errno 106] Transport endpoint is already connected

表示之前的连接仍然完好无损。我对发生了什么以及如何使其工作感到很困惑。以下是屏幕截图,显示了我正在尝试做的事情和问题:

q54UD.png


阅读 13

收藏
2024-11-11

共1个答案

小能豆

出现 OSError: [Errno 107] Transport endpoint is not connectedOSError: [Errno 106] Transport endpoint is already connected 这样的错误,通常表示套接字的连接状态出了问题。这可能与以下几个原因有关:

1. 客户端和服务器的连接顺序或流程问题

在套接字通信中,服务器端需要先创建监听套接字,等待客户端连接;客户端随后发起连接。任何一方在连接之前尝试发送或接收数据都会导致错误。

2. 不正确的套接字关闭或重用

当一个套接字被关闭或被设置成不可重用时,重新尝试连接可能导致 Errno 106Errno 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()

注意事项

  1. 连接顺序:先启动服务器端代码,再启动客户端代码。客户端会自动连接到服务器。

  2. 错误处理:确保使用 try...finallywith 语句来正确关闭连接,以避免资源泄露。

  3. 端口占用问题:如果你重新运行代码,可能会遇到端口被占用的问题。可以通过设置套接字的 SO_REUSEADDR 选项来避免这个问题:
    python server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

希望这可以解决你的问题,如果错误依旧,可能还需要进一步检查网络配置或者防火墙设置。

2024-11-11