Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中通过UDP传输文件。如何在服务器上检测文件结尾?_Java_Networking_Udp - Fatal编程技术网

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

在Java中通过UDP传输文件。如何在服务器上检测文件结尾?,java,networking,udp,Java,Networking,Udp,在客户端,我使用Arrays.CopyofRange()从1FileEvent对象分块缓冲区: 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

在客户端,我使用
Arrays.CopyofRange()
从1
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);

在发送所有缓冲区后,我发送1个字符串“完成”。在服务器上,我通过字符串“done”检查文件的结尾。但它不工作,通过UDP,我怎样才能检测到文件传输的结束。谢谢

UDP是一种不可靠的协议。消息可能会在未通知发件人或收件人的情况下丢失。如果发件人连续快速发送大量邮件,则这种情况尤其可能发生。。。正如您的代码可能会做的那样

因此,我怀疑您的情况是,包含“done”字符串的消息正在丢失



使用UDP无法轻松解决此问题。它需要实现流控制、消息丢失检测和重传。。。在应用程序协议级别。这在技术上是可能的,但切换到TCP或寻找另一种可靠的协议更简单

+1一般来说,在UDP上实现点对点协议与UDP一样快/复杂,除了UDP,您必须自己完成所有工作/测试,对于TCP,这是为您编写和测试了几十年的。谢谢。我使用Thread.sleep(15)来减慢发送文件的速度。但还有什么方法可以检测从客户端发送的文件结束?非常感谢?@L4mbd4-在设计应用程序级文件传输协议时,您需要处理这个问题。有多种方法可以做到这一点。我不想特别解释这一点,因为我不想鼓励你以错误的方式浪费时间。我感谢你的帮助。
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"));