Java can';t通过udp发送大型图像文件

Java can';t通过udp发送大型图像文件,java,udp,Java,Udp,我正在尝试使用JAVA通过UDP发送图像。我已经成功地实现了发送方和接收方,它适用于小图像(本例中为18KB)。当我试图发送一个更大的图像(2MB)时,接收器似乎在发送几百个数据报后阻塞了 这是我的接收器中的循环,它接收来自发送者的每个数据包 while(true) { packetCount++; System.out.println("PKT: " + packetCount); receievePacket = new

我正在尝试使用JAVA通过UDP发送图像。我已经成功地实现了发送方和接收方,它适用于小图像(本例中为18KB)。当我试图发送一个更大的图像(2MB)时,接收器似乎在发送几百个数据报后阻塞了

这是我的接收器中的循环,它接收来自发送者的每个数据包

while(true) {
            packetCount++;
            System.out.println("PKT: " + packetCount);
            receievePacket = new DatagramPacket(recieveData, recieveData.length);

            try {
                receieveSocket.receive(receievePacket);
            } catch (IOException e) {
                System.out.println("Error receieving packet");
                e.printStackTrace();
            }

            bos.write(recieveData, 0, (int) DATAGRAM_MAX_SIZE);
            // Terminate loop if last packet received
            if (packetCount == packetNum) {
                break;
            }

        }
此循环之前的代码只是从用户接收端口号,设置套接字并从发送方接收一个数据包,该数据包指定要发送多少数据包。这存储在packetNum中

有谁能想出一个原因,为什么它在尝试发送更大的图像时会暂停? 谢谢

你的意思是“在接收了几百个数据报之后,接收器似乎卡住了”,而不是发送,对吗?如果是这种情况,那么您可能就是臭名昭著的UDP数据包丢失的受害者!:)有两种选择:

  • 降低传输速率
  • 实现可靠的UDP
  • 第一种方法更容易实现,它应该允许您快速确定是否正在经历数据包丢失。运行一些测试,通过改变传输速率查看是否接收到相同数量的字节(即在发送每个数据包之间放置一个小睡眠)。如果您检测到数据包丢失的差异,则实现可靠的UDP并请求重新传输无序或丢失的数据包。

    您的意思是“接收器在接收到几百个数据包后似乎阻塞了”,而不是发送,对吗?如果是这种情况,那么您可能就是臭名昭著的UDP数据包丢失的受害者!:)有两种选择:

  • 降低传输速率
  • 实现可靠的UDP

  • 第一种方法更容易实现,它应该允许您快速确定是否正在经历数据包丢失。运行一些测试,通过改变传输速率查看是否接收到相同数量的字节(即在发送每个数据包之间放置一个小睡眠)。如果检测到数据包丢失的差异,则实现可靠的UDP,并请求重新传输无序或丢失的数据包。

    UDP只能处理每个数据包中的64kB。您需要将数据分割成块并给它们编号,因为它们不能保证按顺序到达


    但实际上,除非有特殊原因,否则您应该切换到TCP。它可以帮助您解决您遇到的问题,有些问题您还没有看到:)

    UDP只能处理每个数据包中的64kB。您需要将数据分割成块并给它们编号,因为它们不能保证按顺序到达


    但实际上,除非有特殊原因,否则您应该切换到TCP。它可以帮助您解决您遇到的问题,还有一些您还没有看到的问题:)

    看起来有一个最大缓冲区大小限制,根据您是否尝试将较大的图像“分块”成较小的数据包?是的,我的发送者将图像分割成1024字节的数据报,并将每个数据报分别发送给接收者看起来有一个最大缓冲区大小限制,根据你是否尝试将较大的图像“分块”成较小的数据包?是的,我的发送者将图像分割成1024字节的数据报,并将每个数据报分别发送到接收器。我添加了一个睡眠,它工作了,图像传输正常。奇怪的是,如果我添加一个0毫秒的睡眠,它仍然works@sam我猜0的睡眠仍然需要处理时间(可能是为了评估睡眠时间是否大于0),这可能已经足够了。然而,这不是一个好的解决方案-如果您担心数据包丢失,那么实现可靠的UDP将是一个更好的解决方案!嗨,我加了一个睡眠,它工作了,图像传输正常。奇怪的是,如果我添加一个0毫秒的睡眠,它仍然works@sam我猜0的睡眠仍然需要处理时间(可能是为了评估睡眠时间是否大于0),这可能已经足够了。然而,这不是一个好的解决方案-如果您担心数据包丢失,那么实现可靠的UDP将是一个更好的解决方案!