Java UDP包发送和接收问题

时间:2014-09-19 14:05:52

标签: java udp packet packet-loss

我正在使用Java和UDP发送器和接收器进行类的项目。该问题的前提是读取文本文件,将内容存储在数据包中,发送数据包,接收数据包,并在屏幕上读出文件,并在接收计算机上创建相同文本文件的新文本文档

我完成了所有这些工作。当我使用本地主机进行测试时,它似乎可以100%的时间工作。当我从笔记本电脑发送到我的电脑时,它似乎可以100%的时间工作。但是,当我将它从我的PC发送到我的笔记本电脑时,它不起作用。

我有几个System.out调试语句来验证我发送的一些信息。我知道文本文件应该包含7个数据包。但是,每当我将它从我的PC发送到我的笔记本电脑时,它就会说我正在发送46个数据包。

我最初的想法是,数据包可能无序发送。我发送的第一个数据包表示接收方应该接收的数据包数量。我想也许出于某种原因,“46”可能表示一个大写“F”所以我删除了所有的资本“F”,它仍然说我发送了46个数据包。

我想也许我一次发送了太多信息,所以我使用Thread.sleep()让我的接收器有时间跟上 - 这也不起作用。

最后,我通读了Oracle文档和一些在线帖子,发现UDP不可靠。所以,我假设它可能是那样的。但是,我想验证这可能是问题所在。

或者,如果有人能够更好地了解导致问题的原因,那么这个问题也很棒!

感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

是的,UDP是一种不可靠的协议。 UDP消息可能会丢失,发件人或接收者都不会收到任何通知。

7个数据包变为46个数据包通常是由于IP数据包级别的fragmentation。 IP下的协议级别(例如,物理以太网数据包,wifi数据包等)通常对可以一次性发送的最大IP数据包具有硬限制,并且网络路由器,网关强加类似的限制等等。如果发送大于限制的IP数据包,可能会发生两件事:

  • IP数据包可能变成"片段"这需要由接收者重新组装。

  • 中间设备可以将ICMP消息发送回发送方,告诉它发送较小的IP数据包。

在任何一种情况下,最终结果是发送给定大小的UDP消息所需的IP数据包数量可能会有所不同,具体取决于网络。

当然,如果需要将UDP消息作为多个IP数据包发送,并且网络中存在本地拥塞,则会增加数据包的可能性,从而导致消息失败。


但底线是UDP不可靠。如果您需要可靠性,那么简单的解决方案就是使用TCP。