当前位置: 首页 > 知识库问答 >
问题:

JavaUDP数据包收发问题

席言
2023-03-14

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

所有这些我都在工作。当我使用本地主机进行测试时,它似乎在100%的时间内工作。当我把它从我的笔记本电脑发送到我的个人电脑时,它似乎100%的时间都在工作。然而,当我把它从我的电脑发送到我的笔记本电脑时,它就不工作了。

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

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

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

最后,我阅读了Oracle文档和一些在线帖子,发现UDP是不可靠的。所以,我想可能是这样的。然而,我只想证实这可能是个问题。

或者,如果有人对问题的起因有了更好的想法,那也太棒了!

谢谢你的帮助:)

共有1个答案

贺兴平
2023-03-14

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

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

>

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

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

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

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

 类似资料:
  • 我不知道是网络配置还是我的软件出了问题。 这是监听代码: 奇怪的是,在wireshark上,我可以看到:数据包已从发送到,并且设备已对此数据包作出响应--来自的数据包已发送到。使用bind(0.0.0.0,端口)似乎不能涵盖。我迷路了,一点主意都没有。 ifconfig为:

  • Open-Falcon数据收集,分为[绘图数据]收集和[报警数据]收集。下面介绍,如何验证两个链路的数据收集是否正常。 如何验证[绘图数据]收集是否正常 数据链路是:agent->transfer->graph->query->dashboard。graph有一个http接口可以验证agent->transfer->graph这条链路,比如graph的http端口是6071,可以这么访问验证: #

  • 尽管从 WinPcap 的名字上看,这个库的目标应该是数据捕捉(Packet Capture),然而,它也提供了针对很多其它有用的特性。在其中,我们可以找到一组很完整的用于发送数据包的函数。 请注意:原始的libpcap库是不支持发送数据包的,因此,这里展示的函数都属于是WinPcap的扩展,并且它们不能运行于Unix平台下。 使用 pcap_sendpacket() 发送单个数据包 下面的代码展

  • 问题内容: 谁能给我展示一个Java实例来从DatagramSocket接收数据并通过Multicast Socket发送相同的数据 问题答案: 发送多播数据报 为了用Java发送任何类型的数据报,无论是单播,广播还是多播,都需要一个: 可以选择将本地端口提供给套接字必须绑定到的DatagramSocket构造函数。仅当一个人需要其他方能够在特定港口与我们联系时才需要这样做。第三个构造函数获取要绑

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如: