【问题标题】:python - socket not receiving datapython - 套接字未接收数据
【发布时间】:2012-03-08 23:08:20
【问题描述】:

我正在尝试在 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)
  1. 客户端发送带有文件名的 WRQ 数据包,该文件名将成为传输的关键
  2. 服务器识别。此实例中的传输类型 RRQ 或 WRQ 并开始侦听 通过 receiveData() 传输。

客户端在发送 sendWRQ() 后终止,现在服务器或客户端在 sendData 或 receiveData 中出现问题,我得到一个 0kB 的文件

全部代码:

【问题讨论】:

    标签: python sockets networking


    【解决方案1】:

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

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

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

    【讨论】:

    • packet 没有属性 len()... 如果有,它会返回与 __len__() 相同的值。然而,这似乎不是问题。由于服务器到客户端的传输确实有效。最后一个数据包通常小于 512,表示 EOF 和 EOT。
    • 不知道为什么 __len__() 格式化后变成了 len()。我猜你得到 0kB 文件的原因是服务器在接收带有 __len__()==0 的数据包时中断了循环
    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 2020-09-24
    • 2021-10-31
    • 1970-01-01
    • 2013-06-18
    • 2018-03-01
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多