2012-03-08 23 views
0

UDPの上にRFC1350を実装しようとしています。これまでのところすべてがスムーズにファイルを送信していました クライアントからサーバーへのデータを受信して​​クライアントにデータを送信する方法を与えた魅力的な方法でしたが、この方向性はありません。pythonソケットがデータを受信して​​いません

キーサーバーコード:

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()今の問題は、私は、ファイルの聖霊降臨祭0KB

を得るのsendDataかreceiveDataのサーバーまたはクライアント側のいずれかで発生を送信した後に終了コードのすべて:

答えて

0

CL方法ientがサーバーにファイルが完了したことを通知しますが、正しくありません。あなたのコードで

ファイルが完了すると、クライアント側で、あなたは空の文字列を送信するために「のsendto」と呼びますが、これは実際には何もしません。サーバ側では、ファイル "len()== 512"を使用してファイルが完了したかどうかを判断しますが、転送プロセス中にサーバのCPUが転送速度より速く実行されている場合、ゼロのパケット長が頻繁に発生しますが、これは転送が完了したことを示しているわけではありません。

私の提案は、転送の終了を示すために特別なコマンドを使用することであり、そのコマンドを受信したときにサーバーにのみループを中断します。

+0

パケットには属性len()がありません。それがあった場合、__len __()と同じものを返します。 しかし、これは問題ではないようです。サーバーからクライアントへの転送が機能するためです。最後のパケットは通常、EOFとEOTを示す512より小さい。 –

+0

フォーマット後に__len __()がlen()になる理由がわかりません。私はあなたが0kBのファイルを持っている理由は、サーバが__len __()== 0でパケットを受信するときにループを壊すということです – ciphor

関連する問題