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

时间:2018-05-14 12:53:27

标签: python python-3.x sockets networking network-programming

我试图找到解决方案,但没有发现任何帖子。 我正在尝试在两个套接字之间创建一个文件共享系统但是当我的客户端连接到服务器时,首先由服务器发送我的管道错误。 有什么我必须做的事情来保持套接字监听或任何其他方式我可以做这个转移? 我也在运行一个中央服务器,它使这两个客户端成为与其中一个套接字相同的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()

1 个答案:

答案 0 :(得分:1)

问题是,在您的服务器程序中,您正试图在错误的套接字上发送数据。

sock是服务器(或主服务器,如果你愿意)socket。这仅用于侦听传入的连接。

[Python]: socket.accept()文档声明:

  

接受连接。套接字必须绑定到一个地址并侦听连接。返回值是一对(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
  • 如果文件包含“ENDED”字符串,则不会收到完整内容。我建议让你的结束标记更复杂(因此文件中存在的机会尽可能少),或者更好: