java中的对等文件传输

java中的对等文件传输,java,Java,我正在尝试用Java制作一个点对点文件共享网络。我使用UDP连接通过网络发送数据包。但我无法通过UDP连接传输完整的文件。每次都会丢失大部分数据包。如果我延迟发送数据包,接收方将获得所有数据包 这是我的发件人代码: while (fso.hasNextBlock()){ byte[] temp1 =fso.nextBlock(); int size1 = temp1.length; packet=new DatagramPacket(temp1, size1,

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

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

当您想要通过UDP实现文件传输协议时,您需要自己实现

  • 在每个数据包前面加上一个序列号
  • 检查接收器上的序列号,以避免以错误的顺序重新组装
  • 当接收者错过了一个在合理的时间范围内没有收到的序列号时,为接收者实现一些机制,让发送者重新传输它
  • 或者只使用TCP,它在幕后为您做到这一点


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

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

    当您想要通过UDP实现文件传输协议时,您需要自己实现

  • 在每个数据包前面加上一个序列号
  • 检查接收器上的序列号,以避免以错误的顺序重新组装
  • 当接收者错过了一个在合理的时间范围内没有收到的序列号时,为接收者实现一些机制,让发送者重新传输它
  • 或者只使用TCP,它在幕后为您做到这一点


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

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

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

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

    如果您想自己设计,我建议您从网络性能统计的背景开始。我写了一篇关于这个主题的文章:。这篇文章的重点是网络性能分析,但也讨论了为什么网络会以这种方式运行,这对于理解流量控制至关重要

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


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

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

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

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

    如果您想自己设计,我建议您从网络性能统计的背景开始。我写了一篇关于这个主题的文章:。这篇文章的重点是网络性能分析,但也讨论了为什么网络会以这种方式运行,这对于理解流量控制至关重要

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


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

    例如,这个问题已经被回答了一百万次。请阅读这篇文章,了解如何提问IMO UDP不应用于发送文件。这是一个更快的协议,但可能会遗漏包。UDP通常用于流式传输音频或视频,如果某些软件包没有被传输,这是正常的。例如,这个问题已经被回答了一百万次。请阅读这篇文章,了解如何提问IMO UDP不应用于发送文件。这是一个更快的协议,但可能会遗漏包。UDP通常用于流式传输音频或视频,如果某些包没有被传输,这是正常的。我正在创建一个类似BitTorrent的项目。多个对等方可以向单个系统发送相同的文件。我认为UDP更好地实现这样一个系统。@NoufyNoufal你是基于什么事实做出这个假设的?我正在创建一个类似BitTorrent的项目。多个对等方可以向单个系统发送相同的文件。