在Java中通过UDP传输文件。如何在服务器上检测文件结尾?

时间:2014-09-28 13:17:05

标签: java networking udp

在客户端,我使用来自1 Arrays.CopyofRange()对象的FileEvent缓冲区缓冲区:

byte[] data = outputStream.toByteArray();
for (int i = 0; i <= data.length; i += incommingData.length) {             
    byte[] forSent = new byte[0x3ff];
    forSent = Arrays.copyOfRange(data, i, i + 1023);
    DatagramPacket sendPacket = new DatagramPacket(forSent, forSent.length, ipAddress, PORT);
    socket.send(sendPacket);
    System.out.println("File sent from client : " + i);
}
String done = "Done";
DatagramPacket stringDone = new DatagramPacket(done.getBytes(), done.length(), ipAddress, PORT);
socket.send(stringDone);

在服务器上:

do {
    byte[] incomingData = new byte[1024 * 1000 * 50];
    incomingPacket = new DatagramPacket(incomingData, incomingData.length);
    socket.receive(incomingPacket);
    byte[] data ;
    data = incomingPacket.getData();
    result = Arrays.copyOfRange(data, 0, data.length);
    System.out.println("Da nhan:" + result.length);
    message = new String(incomingPacket.getData(), 0, incomingPacket.getLength());
    System.out.println(message);
} while ( !message.equals("Done"));

发送所有缓冲区后,我发送1个字符串&#34;完成&#34;。在Server i,按字符串&#34;完成&#34;检查文件结尾。但它无法通过UDP,如何检测文件传输结束。谢谢!

1 个答案:

答案 0 :(得分:1)

UDP是一种不可靠的协议。在没有通知发送方或接收方的情况下,消息可能会丢失。如果发件人快速连续发送大量邮件,则特别有可能......因为您的代码可能会这样做。

所以我怀疑在你的情况下发生的事情是包含“完成”字符串的消息正在丢失。


使用UDP无法轻易解决这个问题。它需要在应用程序协议级别实现流量控制,消息丢失检测和重传......这在技术上是可行的,但是切换到TCP或寻找替代的可靠协议更简单。