【问题标题】:Java UDP packet sending and receiving issueJava UDP数据包发送和接收问题
【发布时间】:2014-11-14 03:55:35
【问题描述】:

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

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

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

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

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

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

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

感谢您的帮助:)

【问题讨论】:

    标签: java udp packet packet-loss


    【解决方案1】:

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

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

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

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

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

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


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

    【讨论】:

    • 很棒的答案,谢谢!我决定测试一下。我不确定这是否只是巧合,但它似乎成功了。我尝试从笔记本电脑到计算机,播放大量 Youtube 视频,UDP 接收器说它收到了 106 个数据包,最终无法正确接收消息。我将它们全部关闭并再次发送它们并且它起作用了。我从我的电脑到我的笔记本电脑做了同样的实验,我得到了同样的结果。同样,不确定这是否是巧合,但从你所说的和我的实验来看,这似乎是我问题的答案。谢谢:)
    • @BearForceOne - 这表明数据包丢失是问题所在。如果您丢失了一个数据包,您将丢失整个 UDP 消息,因此您的文件传输将失败。
    猜你喜欢
    • 2011-11-22
    • 2012-10-03
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多