我正在尝试在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)
客户端在发送sendWRQ()之后终止现在在sendData或者sendData中的服务器或客户端出现问题我得到一个文件whit 0kB
所有代码:
答案 0 :(得分:0)
客户端通知服务器文件已完成的方法不正确。
在你的代码中,当文件完成时,在客户端,你会调用“sendto”发送一个空字符串,但这实际上什么都不做;在服务器端,你使用条件“packet。 len ()== 512”判断文件是否完成,但是,在传输过程中,如果服务器cpu运行速度比传输快速度,您将经常获得零数据包长度,但这并不表示传输已完成,也许下一个数据包正在路上。
我的建议是使用特殊命令来指示传输结束,服务器只会在收到该命令时中断循环。