2014-09-19 179 views
0

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

我有所有的工作。当我使用本地主机进行测试时,它似乎在100%的时间内工作。当我从我的笔记本电脑发送到我的电脑时,它似乎在100%的时间内工作。但是,当我从我的PC发送到我的笔记本电脑时,它不起作用。

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

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

我以为也许我一次发送太多的信息,所以我使用Thread.sleep()来给我的接收器时间跟上 - 这也没有工作。

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

或者如果任何人有更好的主意,可能会导致问题,这将是真棒!

感谢您的帮助:)

回答

0

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

7个数据包变成46个数据包通常是由于IP数据包级别的fragmentation造成的。 IP之下的协议级别(例如,物理以太网分组,WiFi分组等)通常对可以“一次性”发送的最大IP分组具有硬限制,并且类似的限制由网络路由器,网关等实施。如果发送的是比限制的IP数据包,有两种情况:

  • 的IP数据包可能变成需要由接收方进行重组“片段”。

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

在任一情况下,最终结果是,发送一个给定尺寸的UDP消息所需的IP数据包的数量可以变化,这取决于在网络上。

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


但是底线是UDP不可靠。如果你想要可靠性,简单的解决方案是使用TCP代替。

+0

非常好的答案,谢谢!我决定对它进行测试。我不确定这是否只是巧合,但似乎是泛泛而谈。我用我的笔记本电脑在我的电脑上播放了大量Youtube视频,UDP Receiver表示它收到了106个数据包,最终无法正常接收信息。我把它们全部关掉,然后再次发送它,并且工作。我从我的电脑到我的笔记本电脑做了同样的实验,结果也一样。再次,不知道这是否是巧合,但从你说的和我的实验看来,这似乎是我的问题的答案。谢谢:) – BearForceOne 2014-09-19 18:52:24

+0

@BearForceOne - 指出数据包丢失是问题所在。如果丢失了一个数据包,则会丢失整个UDP消息,因此文件传输将失败。 – 2014-09-19 22:44:03