如何避免与并发UDP服务器丢弃数据包

时间:2013-01-25 07:52:44

标签: java sockets udp

Here is the original link产生了这个问题。

因此,显然DataGramSocket不会对收到的数据包进行排队。因此,如果两个系统同时发送,其中一个数据包将丢失(使用链接中的代码)。我正在寻找避免丢弃数据包的方法。

2 个答案:

答案 0 :(得分:2)

如果您想确保没有数据(数据包)丢失,请使用TCP!

UDP的一个优点是开销较小,因此用于拥塞,高流量连接,如视频或游戏流。开销较低的原因是缺乏对传输过程中数据不会丢失的保证。

从您的问题看来,您确实关心缺少数据,因此您需要构建一些措施来检测这一点。如果你这样做,你可能希望重新发送数据,直到它正确到达?这就是TCP为您提供的......!

如果确实是Java正在丢弃数据,那可能是因为队列已满。 UDP协议可能已经过了,但是Java知道有一个UDP协议及其所有的后果'。由于UDP专为高吞吐量而设计,因此Java部件的设计符合相同的要求。排队所有导致(大量)开销,这与UDP设计相反,因此这种可能性极小。此外,从队列中删除数据与在传输过程中丢失数据(IMHO)没什么不同,所以Java丢弃数据并不让我感到惊讶!

如果你想要防止这种情况,你需要更大的队列(虽然也可能填满),更重要的是更快地处理排队数据(以防止填充队列)。

最重要的事情是接受数据丢失!如果您的应用程序/服务器无法处理此问题:不使用UDP

答案 1 :(得分:1)

有队列,但它们总是有限的,你总能达到极限。没有办法完全避免这样的问题。您可以通过在服务器上实现低负载来最大限度地减少影响,从而快速排空队列,并为UDP流量提供专用网络。

通常,您必须为丢失的数据包构建一些容差,并且必须使协议可靠。