0

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

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

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

我最初的想法是,数据包可能是乱序发送的。我发送的第一个数据包表明接收者应该期望接收多少数据包。我想也许出于某种原因,“46”可能表示大写“F”,所以我删除了所有大写“F”,它仍然说我正在发送 46 个数据包。

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

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

或者,如果有人对可能导致问题的原因有更好的了解,那也很棒!

谢谢你的帮助 :)

4

1 回答 1

0

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

7 个数据包变成 46 个数据包通常是由于IP 数据包级别的分段。IP 下的协议级别(例如物理以太网数据包、wifi 数据包等)通常对可以“一次性”发送的最大 IP 数据包有硬性限制,网络路由器、网关等也施加了类似的限制。如果发送大于限制的 IP 数据包,可能会发生两种情况:

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

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

无论哪种情况,最终结果是发送给定大小的 UDP 消息所需的 IP 数据包数量可能会因网络而异。

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


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

于 2014-09-19T14:40:08.140 回答