保持套接字监听python,避免断管错误
我试图找到解决办法,但在任何帖子上都没有找到。 我试图在两个套接字之间创建一个文件共享系统,但当我的客户端连接到服务器时,在服务器第一次发送时,我收到了断管错误。 我是否需要做些什么来保持套接字侦听,或者以其他方式进行传输? 我还运行一个中央服务器,使这两个客户端成为与套接字之一位于同一ip上的服务器-客户端对。这会导致这个问题吗?在它创建临时配对后,我让它进入睡眠状态 以下是服务器代码:保持套接字监听python,避免断管错误,python,python-3.x,sockets,networking,network-programming,Python,Python 3.x,Sockets,Networking,Network Programming,我试图找到解决办法,但在任何帖子上都没有找到。 我试图在两个套接字之间创建一个文件共享系统,但当我的客户端连接到服务器时,在服务器第一次发送时,我收到了断管错误。 我是否需要做些什么来保持套接字侦听,或者以其他方式进行传输? 我还运行一个中央服务器,使这两个客户端成为与套接字之一位于同一ip上的服务器-客户端对。这会导致这个问题吗?在它创建临时配对后,我让它进入睡眠状态 以下是服务器代码: def create_server(self,ip,path ): #ip is of the serv
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是服务器或主服务器,如果您要使用socket的话。仅用于侦听传入连接 文件规定: 接受连接。套接字必须绑定到地址并侦听连接。返回值是pair conn,其中conn是可用于在连接上发送和接收数据的新套接字对象,address是绑定到连接另一端的套接字的地址 更改您的线路以及包含sock.send from的所有其他线路: 致: 台词:
conn.send("ENDED".encode())
print("Transfer complete")
应该在缩进的while循环中移动,也许可以在循环的末尾添加conn.close
在客户端程序中:
try/except子句是无用的,因为服务器不侦听端口12346
如果文件包含结束字符串,则不会收到完整内容。我建议将您的结束标记变得更复杂,以便尽可能少地出现在文件中,或者更好:
首先发送文件大小,然后在客户机上,准确地期望要检查的字节数
谢谢,我为犯这样的错误感到羞愧。这次尝试是因为我在代码的其余部分做了一些修改,但忘记了删除。另外,谢谢你给我的其他建议。没必要感到羞愧。这就是社区存在的原因。如果这个答案解决了你的问题,别忘了接受它。
conn.send("Start".encode())
conn.send("ENDED".encode())
print("Transfer complete")