在客户端,我使用来自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,如何检测文件传输结束。谢谢!
答案 0 :(得分:1)
UDP是一种不可靠的协议。在没有通知发送方或接收方的情况下,消息可能会丢失。如果发件人快速连续发送大量邮件,则特别有可能......因为您的代码可能会这样做。
所以我怀疑在你的情况下发生的事情是包含“完成”字符串的消息正在丢失。
使用UDP无法轻易解决这个问题。它需要在应用程序协议级别实现流量控制,消息丢失检测和重传......这在技术上是可行的,但是切换到TCP或寻找替代的可靠协议更简单。