在客户端,我使用 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,我如何检测文件传输结束。谢谢!
UDP 是一种不可靠的协议。消息可能会丢失,而发送者或接收者都没有得到通知。如果发件人快速连续发送大量消息,这种情况尤其可能发生……正如您的代码可能会做的那样。
所以我怀疑你的情况发生的是包含“done”字符串的消息正在丢失。
使用 UDP 没有简单的方法可以解决这个问题。这需要在应用程序协议级别实施流量控制、消息丢失检测和重传。这在技术上是可行的,但更简单的方法是切换到 TCP,或寻找替代的“可靠”协议。
然后从接收端检测数据包是否等于结束字符串,然后跳出接收它的循环。 if (Arrays.equals("[UDP 流结束]".getBytes(), Arrays.copyOf(buff, 19))) { System.out.println("检测到流结束"); 休息; }