在客户端I,将来自1个FileEvent
对象的Arrays.CopyofRange()
块缓存:
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”。在服务器端,我通过字符串“done”检查文件的结尾。但它不工作,通过UDP,我怎么能检测到文件传输结束。谢谢你,谢谢
2条答案
按热度按时间idfiyjo81#
UDP是一种不可靠的协议。消息可能会丢失,而发送方或接收方都没有得到通知。如果发送者快速连续地发送大量消息,则这种情况尤其可能发生……就像你的代码可能会做的那样。
所以我怀疑在您的案例中发生的情况是,包含“done”字符串的消息正在丢失。
使用UDP对此没有简单的解决方法。这将需要实现流量控制、消息丢失检测和重传。在应用协议级。这在技术上是可行的,但切换到TCP或寻找替代的“可靠”协议更简单。
2skhul332#
从发送文件的应用程序中,在传输文件后发送新数据包。给前任的。
然后从接收端,检测数据包是否等于结束字符串,然后中断接收它的循环。