0

Javaでピアツーピアのファイル共有ネットワークを作ろうとしています。ネットワーク経由でパケットを送信するために UDP 接続を使用しています。しかし、UDP 接続を介して完全なファイルを転送することはできません。ほとんどのパケットが毎回欠落しています。パケットを遅延して送信すると、受信者はすべてのパケットを取得します。

これは送信者の私のコードです:

while (fso.hasNextBlock()){   
   byte[] temp1 =fso.nextBlock();   
   int size1 = temp1.length;  

   packet=new DatagramPacket(temp1, size1,ipaddress,port);
   socket.send(packet);                           

   // Thread.sleep(100);
} 

これは受信者コードです:

FileOutputStream  out=new FileOutputStream(file);
byte[] data=new byte[size];
DatagramPacket packet=new DatagramPacket(data, data.length);
int i=0;
while(true){                   
    socket.receive(packet);
    out.write(packet.getData());
    System.out.println("packet "+i);
    i++;
    ..... // some codes                    
}

私のコードに何か問題がありますか?
ピア ツー ピア ネットワークに詳しくありません。ファイル共有ネットワークでは、TCP と UDP のどちらを使用するのが適切ですか?

4

2 に答える 2

4

UDP プロトコルは、設計上、信頼できません。パケットが順番どおりに受信され、まったく受信されることを保証するものではありません。

UDP 経由でファイル転送プロトコルを実装する場合は、これを自分で実装する必要があります。

  1. すべてのパケットにプレフィックスとしてシーケンス番号を付ける
  2. レシーバーのシーケンス番号を確認して、間違った順序で再組み立てしないようにします
  3. 受信者が妥当な時間内に受信されなかったシーケンス番号を見逃した場合、受信者が送信者にそれを再送信するように依頼するメカニズムを実装します。

または、舞台裏でまさにそれを行うTCPを使用してください。

ファイル転送に UDP を使用する正当な理由がない場合は、TCP を使用してください。すべてを心配する必要がないからです。インターネットで最も広く使用されている 3 つのファイル転送プロトコルである HTTP、FTP、および BitTorrent が TCP を使用するのには理由があります。

于 2013-04-16T12:37:19.910 に答える