无法通过udp发送大图像文件

时间:2012-02-22 18:49:58

标签: java udp

我正在尝试使用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中。

在试图发送更大的图像时,有人会想到它停滞的原因吗? 感谢

2 个答案:

答案 0 :(得分:2)

UDP每个数据包只能处理64kB。您需要将数据分段为块并为其提供数字,因为它们无法保证按顺序到达。

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

答案 1 :(得分:1)

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

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