2012-03-08 64 views
0

我想在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. 服務器RECOG的關鍵。傳輸類型RRQ或WRQ,並開始通過receiveData()監聽 傳輸。發送sendWRQ()現在發生在發送數據或接收任何服務器或客戶端上的一個問題,我得到一個文件絲毫0KB

客戶終止所有代碼:

回答

0

的方法,該CL客戶通知服務器文件已完成,是不正確的。

在你的代碼中,當文件完成時,在客戶端,你會調用「sendto」發送一個空字符串,但這實際上什麼也不做;在服務器端,您使用條件「數據包。len()== 512」來判斷文件是否已完成,但是,在傳輸過程中,如果服務器cpu運行速度比傳輸速度快,則會得到零包長度頻繁,但這並不表示傳輸完成,也許下一個數據包剛好在路上。

我的建議是使用一個特殊的命令來指示傳輸結束,服務器只會在接收到該命令時打破環路。

+0

數據包沒有屬性len()...並且如果它有它會返回相同的__len __()。 但這似乎不成問題。由於服務器到客戶端傳輸確實有效。最後一個數據包通常小於512,表示EOF和EOT。 – 2012-03-08 15:19:27

+0

不知道爲什麼__len __()變成格式化後的len()。我猜你得到0kB文件的原因是服務器在用__len __()== 0接收數據包時發生循環 – ciphor 2012-03-08 15:24:11