当服务器只有1个UDP套接字时,如何处理许多传入的UDP数据包?



当服务器只有一个UDP套接字,而许多客户端正在向它发送UDP数据包时,处理所有传入数据包的最佳方法是什么?

我认为这也可能是TCP数据包的问题,因为有一个有限的线程数,它不能覆盖所有客户端TCP套接字接收事件。

但是在这种情况下情况会更好,因为每个客户端有一个TCP套接字,即使网络缓冲区已满,数据包接收也会被阻塞,直到队列有空间(如果我错了,请告诉我)。

UDP数据包,然而,被丢弃时,缓冲区已满,只有一个套接字,所以发生这种情况的机会更高。

我该如何解决这个问题?我找了一会儿,但没有得到明确的答案。我是否应该实施自己的排队系统?或者只是最大化网络缓冲区大小?

no way以保证您不会丢失UDP消息。不管你怎么做,如果发送的数据包速率太大,你就会在接收主机或网络中的某个地方丢失一些数据包。

一些可以帮助的事情包括:

  • 在Java应用程序中实现消息的内部队列,并将它们交给线程池进行处理。

  • 增加内核的消息缓冲

但是这两种方法都不能处理平均消息到达率高于接收方处理它们的能力或网络容量的情况。这将不可避免地导致消息(请求)丢失。

我已经找了一段时间,但是我没有得到一个明确的答案。

那是因为根本没有!有些问题根本无法解决。对其他人来说,最好的答案取决于难以衡量或预测的因素。

如果你想要确定性…不要用网络!)


在TCP的情况下,您应该做的是为每个客户端使用一个(长期)套接字。根据需要支持的套接字数量,您可以:

  • 为每个套接字(和客户端)分配一个服务器端线程。
  • 使用java.nio.channels.Selector和线程池

如果请求的速度超过服务器处理它们的能力,您仍然会遇到问题。然而,TCP连接将确保请求不会丢失,并且客户端会得到一些"回压"。

最新更新