我正在尝试学习如何在python中使用套接字在两台计算机之间进行通信。不幸的是,当一切似乎都正确时,我会收到此错误:
OSError:[Errno 107]传输端点未连接
通过谷歌搜索,我发现这是因为连接可能已经丢失。但是我在同一台机器上运行程序的客户端和服务器端。我尝试从客户端再次连接,我得到了这个:
OSError:[Errno 106]传输端点已连接
表示先前的连接仍然完好无损。我对发生的事情以及如何使其发挥作用感到非常困惑。这是一个屏幕截图,显示了我想要做的事情和问题:
答案 0 :(得分:18)
我在python 3.5.0上进行了一些改动测试了你的代码,它的工作原理如下:
我认为诀窍是在sock.accept()
方法中返回一个元组:
socket.accept()接受连接。套接字必须绑定到 地址和侦听连接。 返回值是一对 (conn,address)其中conn是一个可用于发送和的新套接字对象 接收连接数据,地址是绑定的地址 连接另一端的套接字。
#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
答案 1 :(得分:0)
我遇到了同样的错误,我意识到这是因为一个小问题:在 handle_client
函数中,我使用了 server.recv
而不是 conn.recv
,所以 { {1}} 程序正在尝试从其自身接收数据。
以下是更正后的版本:
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