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,因为这样您就不必担心所有这些。HTTP、FTP 和 BitTorrent(互联网上使用最广泛的三种文件传输协议)使用 TCP 是有原因的。

于 2013-04-16T12:37:19.910 回答
2

您所看到的是由于发送数据的速度超过网络路径可以处理的速度而导致的数据包丢失。UDP 没有流量控制或丢失恢复。如果您只是将数据包转储到网络中,路由器队列将溢出并丢弃一些数据包。这就是为什么放慢速度可以减少损失。

要使用 UDP 进行文件传输,您需要实现自己的流量控制和丢失恢复算法。做到这一点并不容易,做好也很难。基于 UDP 的协议通常用于 TCP 算法崩溃的地方,这仅仅是因为 UDP 提供了一个干净的板来实现新算法。

除非您想深入了解网络传输设计理论,否则最好使用 TCP 或查看已经存在的众多 UDP 文件传输协议之一。

如果您对自己设计感到好奇,我建议您从网络性能统计的背景开始。我写了一篇关于这个主题的文章:损失、延迟和速度。这篇文章专注于网络性能分析,但它也讨论了为什么网络会以它们的方式运行,这对于理解流量控制至关重要。

可以在Wikipedia上找到现有 UDP 协议的列表。但是除非你有一些令人信服的性能原因(或令人信服的好奇心),否则最好还是坚持使用 TCP。

免责声明:我为生产多用途交易协议的公司工作。

于 2013-04-18T15:58:59.460 回答