我正在尝试使用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中。
在试图发送更大的图像时,有人会想到它停滞的原因吗? 感谢
答案 0 :(得分:2)
UDP每个数据包只能处理64kB。您需要将数据分段为块并为其提供数字,因为它们无法保证按顺序到达。
但实际上,除非有特殊原因,否则应切换到TCP。它可以帮助您解决您遇到的问题,以及一些您尚未看到的问题:)
答案 1 :(得分:1)
你的意思是“接收器似乎在接收几百个数据报后堵塞”,而不是发送,对吗?如果是这种情况,那么你可能会成为臭名昭着的UDP数据包丢失的受害者! :)有两种选择:
第一个更容易做,它应该允许您快速确定您是否遇到丢包。运行一些测试,看看你是否通过改变传输速率接收相同数量的字节(即在发送每个数据包之间放一个小睡眠)。如果检测到数据包丢失的差异,则实现可靠的UDP并请求重新传输无序或丢失的数据包。