在java中对等文件传输

时间:2013-04-16 12:23:25

标签: java

我正在尝试用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?

2 个答案:

答案 0 :(得分:4)

UDP协议在设计上是不可靠的。它不保证数据包按顺序接收并完全接收。

如果要通过UDP实现文件传输协议,则需要自己实现。

  1. 为每个数据包添加序列号前缀
  2. 检查接收器上的序列号,以避免以错误的顺序重新组装
  3. 当接收方错过了在合理时间范围内未收到的序列号时,请实施某种机制让接收方要求发送方重新发送。
  4. 或者只是使用TCP,它会在幕后为您完成。

    当您没有充分的理由使用UDP进行文件传输时,请使用TCP,因为这样您就不必担心这一切。 HTTP,FTP和BitTorrent是互联网上使用最广泛的三种文件传输协议,它使用TCP。

答案 1 :(得分:2)

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

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

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

如果您想设计自己的,我建议您先从网络性能统计数据的背景知识开始。我写了一篇关于这个主题的文章:Loss, Latency, and Speed。本文主要关注网络性能分析,但它也讨论了为什么网络的行为方式,这对于理解流量控制至关重要。

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

免责声明:我为生产Multipurpose Transaction Protocol的公司工作。