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

问题描述 投票:0回答:2

在客户端,我使用 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 个字符串“完成”。在服务器上,我通过字符串“done”检查文件结尾。但它不起作用,通过 UDP,我如何检测文件传输结束。谢谢!

java networking udp
2个回答
1
投票

UDP 是一种不可靠的协议。消息可能会丢失,而发送者或接收者都没有得到通知。如果发件人快速连续发送大量消息,这种情况尤其可能发生……正如您的代码可能会做的那样。

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


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


0
投票

然后从接收端检测数据包是否等于结束字符串,然后跳出接收它的循环。 if (Arrays.equals("[UDP 流结束]".getBytes(), Arrays.copyOf(buff, 19))) { System.out.println("检测到流结束"); 休息; }

© www.soinside.com 2019 - 2024. All rights reserved.