我试图找到解决方案,但在任何帖子上都没有找到。我正在尝试在两个套接字之间创建一个文件共享系统,但是当我的客户端连接到服务器时,在第一次由服务器发送时,我遇到了管道损坏错误。有什么我必须做的事情来保持套接字监听或我可以通过任何其他方式进行这种传输吗?我还运行一个中央服务器,它使这两个客户端在与套接字之一相同的 IP 上成为服务器-客户端对。这会导致这个问题吗(我在它创建临时对后让它进入睡眠状态)这里是服务器代码:
def create_server(self,ip,path ): #ip is of the server
connection_list = []
print(ip)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((ip, 12345))
print("server created")
connection_list.append(sock)
sock.listen(1)
#offset = 0
file = open(path, "rb")
print("file opened")
while True:
print("waiting for connection...")
conn, addr = sock.accept()
print ('New connection from %s:%d' % (addr[0], addr[1]))
print("accepted connection")
connection_list.append(conn)
sock.send(str("Start").encode()) # THIS CAUSES BROKEN PIPE ERROR
chunk = file.read(4096)
print("chunk read")
if not chunk:
break # EOF
sock.send(chunk)
print("chunk sent")
sock.send(str("ENDED").encode())
print("Transfer complete")
sock.close()
这是客户端代码:
def create_client(self,ip,file ): #ip of server
print(ip)
print("going to download",str(file))
try:
client=socket.create_connection((ip, 12345 ))
except:
client=socket.create_connection((ip, 12346 ))
print("client created")
with open(str(file), 'wb') as f:
socket_list = [client]
print("file opened")
data=client.recv(4096)
while data.decode()!="Start":
data=client.recv(4096)
while True:
print("started")
data=client.recv(4096)
print("recieved data")
if data.decode()=="ENDED":
break
f.write(data)
print("Transfer complete")
f.close()
time.sleep(5)
client.close()
问题是在您的服务器程序中,您试图在错误的套接字上发送数据。
sock
是服务器(或主,如果你愿意的话)套接字。这仅用于侦听传入连接。
接受连接。套接字必须绑定到一个地址并侦听连接。返回值是一对
(conn, address)
,其中conn是可用于在连接上发送和接收数据的新套接字对象,address是绑定到连接另一端的套接字的地址。
从以下位置更改您的行(以及所有其他具有 的行sock.send
):
sock.send(str("Start").encode())
至:
conn.send("Start".encode())
线路:
conn.send("ENDED".encode())
print("Transfer complete")
应该在while
循环内移动(缩进),也许你可以conn.close()
在循环的末尾添加一个。
在您的客户端程序中:
try
/except
子句是没用的,因为服务器不监听端口12346本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句