python - 套接字没有接收数据

时间:2012-03-08 14:56:22

标签: python sockets networking

我正在尝试在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()传输。
  3. 客户端在发送sendWRQ()之后终止现在在sendData或者sendData中的服务器或客户端出现问题我得到一个文件whit 0kB

    所有代码:

1 个答案:

答案 0 :(得分:0)

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

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

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