Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保持套接字监听python,避免断管错误_Python_Python 3.x_Sockets_Networking_Network Programming - Fatal编程技术网

保持套接字监听python,避免断管错误

保持套接字监听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

我试图找到解决办法,但在任何帖子上都没有找到。 我试图在两个套接字之间创建一个文件共享系统,但当我的客户端连接到服务器时,在服务器第一次发送时,我收到了断管错误。 我是否需要做些什么来保持套接字侦听,或者以其他方式进行传输? 我还运行一个中央服务器,使这两个客户端成为与套接字之一位于同一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是服务器或主服务器,如果您要使用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")