操作系统错误:[Errno 107] 传输端点未连接

28

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

OSError: [Errno 107] 传输端点未连接

经过谷歌搜索,我发现这是由于连接可能已经断开。但是我在同一台计算机上运行程序的客户端和服务器端。我尝试重新从客户端尝试连接,但是我得到了这个:

OSError: [Errno 106] 传输端点已经连接

这表明先前的连接仍然存在。我很困惑发生了什么以及如何使其正常工作。这里有一个屏幕截图,显示了我正在尝试做什么以及问题:

enter image description here


请不要上传代码/数据/错误的图片。 - undefined
2个回答

34

我在Python 3.5.0上使用了你的代码,并做了一点修改,它可以正常工作:

我认为关键在于sock.accept()方法,它返回一个元组:

socket.accept() 接受一个连接。套接字必须绑定到一个地址并且正在监听连接。 返回值是一个二元组 (conn, address) ,其中 conn 是一个新的套接字对象, 可以用来在连接上传输数据,address 是在连接的另一端绑定到套接字的地址。

服务器

#server
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.bind(("localhost", 8081))
>>> sock.listen(2)
>>> conn, addr = sock.accept()
>>> data= conn.recv(1024).decode("ascii") 

客户端:

#client
>>> import socket
>>> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> sock.connect(("localhost",8081))
>>> sock.send("hi".encode())
2
>>> sock.send("hiiiiiii".encode())
8
>>> sock.send(("#"*1020).encode())
1020

4
我一直遇到同样的错误,后来发现是一个小问题:在 handle_client 函数中,我写成了 server.recv 而不是 conn.recv,导致 server.py 程序试图从自己这边接收数据。

以下是更正后的版本:

server.py:

import socket
import threading

def handle_client(conn, addr):
    while True:
        msg_length = conn.recv(64).decode("utf-8") # I got the error when I put server.recv
        if msg_length:
           msg = conn.recv(int(msg_length)).decode('utf-8') # Here too
           print(msg)

def start():
    server.listen()
    while True:
        conn, addr = server.accept()
        thread = threading.Thread(target=handle_client, args=(conn, addr))
        thread.start()

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((socket.gethostbyname(socket.gethostname()), 5050))

start()

client.py:

import socket
import threading

def send(msg):
    client.send(str(len(msg)).encode('utf-8').ljust(64))
    client.send(msg.encode('utf-8'))

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((socket.gethostbyname(socket.gethostname()), 5050))

send("Hello world!")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接