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

uhry853o  于 2023-09-29  发布在  Java
关注(0)|答案(2)|浏览(94)

在客户端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,我怎么能检测到文件传输结束。谢谢你,谢谢

idfiyjo8

idfiyjo81#

UDP是一种不可靠的协议。消息可能会丢失,而发送方或接收方都没有得到通知。如果发送者快速连续地发送大量消息,则这种情况尤其可能发生……就像你的代码可能会做的那样。
所以我怀疑在您的案例中发生的情况是,包含“done”字符串的消息正在丢失。
使用UDP对此没有简单的解决方法。这将需要实现流量控制、消息丢失检测和重传。在应用协议级。这在技术上是可行的,但切换到TCP或寻找替代的“可靠”协议更简单。

2skhul33

2skhul332#

从发送文件的应用程序中,在传输文件后发送新数据包。给前任的。

DatagramPacket dp = new DatagramPacket("[END OF UDP STREAM]".getBytes(), 19, ip, port);

然后从接收端,检测数据包是否等于结束字符串,然后中断接收它的循环。

if (Arrays.equals("[END OF UDP STREAM]".getBytes(), Arrays.copyOf(buff, 19)))
{
    System.out.println("END OF STREAM DETECTED");
    break;
}
  • buff是缓冲datgram分组的byte[]数组

相关问题