java - java中的点对点文件传输

标签 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 哪个更好?

最佳答案

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

当你想通过UDP实现文件传输协议(protocol)时,你需要自己实现。

  1. 为每个数据包添加序列号前缀
  2. 检查接收器上的序列号,以避免以错误的顺序重新组装它们
  3. 当接收方错过了未在合理时间范围内收到的序列号时,请实现某种机制,让接收方要求发送方重新传输它。

或者只使用 TCP,它会在幕后为您完成此操作。

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

关于java - java中的点对点文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036979/

相关文章:

java - 如何使用 JAXB 将 XML 转换为对象

java - 如何使用java中的Scanner类将两个或更多单词存储在一个字符串变量中,然后将下一个输入存储在另一个字符串变量中?

java - 如何用网页更新 portlet View ?

java - 在 RxJava 2 中正确使用 Observable.create()(最佳实践)

java - 为除尖括号外的非字符外的每个单词添加标签

使用 shell 脚本的 Java 代码格式化

java - 我的绘画方法给了我一个错误,我不知道为什么

java - 如何使用 java 读取制表符分隔文件并从中选择几个值

java - 插件 : how to get all the types available in my eclipse Workspace?

java - 搜索字符串只打印出没有附加字符的搜索