这是产生这个问题的原始链接。
所以,显然 DataGramSocket 不会排队接收到的数据包。因此,如果两个系统同时发送,其中一个数据包将丢失(使用链接中的代码)。我正在寻找避免在这种情况下丢弃数据包的方法。
如果您想确保没有数据(数据包)丢失,请使用 TCP!
UDP 的一个优点是开销较小,因此可用于拥塞、高流量的连接,例如视频或游戏流。较低开销的一个原因是缺乏关于数据在传输过程中不会丢失的保证。
从您的问题来看,您似乎确实关心丢失的数据,因此您需要建立措施来检测这一点。如果您愿意,您可能希望数据在正确到达之前重新发送?这就是 TCP 为您提供的……!
如果真的是 Java 正在丢弃数据,那可能是由于队列已满。UDP 协议可能“结束”了,但 Java 知道有一个 UDP 协议及其所有“后果”。由于 UDP 是为高吞吐量而设计的,Java 部分也是为同样的要求而设计的。对所有内容进行排队会导致(大量)开销,这与 UDP 设计相反,因此这极不可能。此外,从队列中删除数据与在传输过程中丢失数据(恕我直言)没有什么不同,所以 Java 删除数据并不让我感到惊讶!
如果要防止这种情况发生,则需要更大的队列(尽管也可能会填满),更重要的是更快地处理排队的数据(以防止填满队列)。
但最重要的是接受数据丢失!如果您的应用程序/服务器无法处理:请勿使用 UDP
有队列,但它们总是有限的,你总是可以达到极限。没有办法完全避免这样的问题。您可以通过在服务器上设置低负载来最大限度地减少影响,以便它可以快速耗尽队列,并为 UDP 流量提供专用网络。
通常,您必须为丢失的数据包预留一些余量,并且必须使协议可靠。