python-套接字不接收数据

python-套接字不接收数据,python,sockets,networking,Python,Sockets,Networking,我正在尝试在UDP上实现RFC1350。到目前为止,发送一份文件一切顺利 从服务器到客户机的工作非常有魅力,我给出了将数据接收到服务器并将数据发送到客户机的方法,但这个方向是行不通的 密钥服务器代码: def listen(self): while True: packet, address = self.serverSocket.recvfrom(512) mode = str(packet)[2:5] self.file =

我正在尝试在UDP上实现RFC1350。到目前为止,发送一份文件一切顺利 从服务器到客户机的工作非常有魅力,我给出了将数据接收到服务器并将数据发送到客户机的方法,但这个方向是行不通的

密钥服务器代码:

    def listen(self):
    while True:
        packet, address = self.serverSocket.recvfrom(512)

        mode = str(packet)[2:5]
        self.file = str(str(packet)[6:]).replace("'", "")

        if(mode == "RRQ"):
            self.sendResponse(address)
        else:
            self.receiveData()

def receiveData(self):
    data = open("new1.jpg", "wb")
    while True:
        packet, server = self.serverSocket.recvfrom(512)
        if packet.__len__() == 512:
            data.write(packet)
        else:
            data.write(packet)
            break;
关键客户代码:

    def sendWRQ(self):
    request = 'WRQ-' + self.file
    self.clientSocket.sendto(str(request).encode(), (self.serverAddress, self.serverPort))
    self.sendData()

def sendData(self):
    with open(self.file, "rb") as data:
        while True:
            packet = data.read(512)
            if packet != b"":
                self.clientSocket.sendto(packet, (self.serverAddress, self.serverPort))
            else:
                self.clientSocket.sendto(packet, (self.serverAddress, self.serverPort))
                break
            time.sleep(0.0005)
  • 客户端发送带有文件名的WRQ数据包,该文件名将作为传输密钥
  • 服务器记录。此实例中的传输类型为RRQ或WRQ,并开始侦听 通过receiveData()进行传输
  • 客户端在发送sendWRQ()后终止。现在,sendData或receiveData中的服务器或客户端出现问题,我得到一个0 KB的文件

    所有代码:

    • 服务器类:
    • 客户端类:

    客户端通知服务器文件已完成的方法不正确

    在您的代码中,当文件完成时,在客户端,您将调用“sendto”来发送一个空字符串,但这实际上不会起任何作用;在服务器端,您使用条件“packet.len()==512”来判断文件是否已完成,但是,在传输过程中,如果服务器cpu的运行速度超过传输速度,您将经常获得零数据包长度,但这并不表示传输已完成,也许下一包就在路上

    我的建议是使用一个特殊的命令来指示传输的结束,服务器只有在收到该命令时才会中断循环。

    数据包没有属性len()。。。如果它有,它将返回与_len__()相同的结果。然而,这似乎不是一个问题。因为服务器到客户端的传输是有效的。最后一个数据包通常小于512,表示EOF和EOT。不知道为什么格式化后_ulen__u;()变为len()。我猜您得到0kB文件的原因是服务器在接收到带有_ulen__;()==0的数据包时中断了循环