我正在尝试用 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)时,你需要自己实现。
- 为每个数据包添加序列号前缀
- 检查接收器上的序列号,以避免以错误的顺序重新组装它们
- 当接收方错过了未在合理时间范围内收到的序列号时,请实现某种机制,让接收方要求发送方重新传输它。
或者只使用 TCP,它会在幕后为您完成此操作。
当您没有充分的理由使用 UDP 进行文件传输时,请使用 TCP,因为这样您就不必担心所有这些。 HTTP、FTP 和 BitTorrent 这三种互联网上使用最广泛的文件传输协议(protocol)使用 TCP 是有原因的。
关于java - java中的点对点文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16036979/