【问题标题】:What's the advantage to use Datagram Channel compared to Datagram Socket与 Datagram Socket 相比,使用 Datagram Channel 有什么优势
【发布时间】:2017-06-19 00:49:29
【问题描述】:

我正在尝试优化 UDP 服务器以处理更多吞吐量,它基于 Java IO 数据报套接字(不是 NIO)。 当这个 UDP 服务器收到一个 UDP 数据包时,它需要处理这个数据包,并将处理后的数据发送到后台资源,然后响应客户端。 目前该服务器将为每个传入的数据包分配一个线程来处理。

我读过一些文章,我明白了 对于某些情况,例如基于 TCP 的聊天服务器: 需要同时管理数千个打开的连接,每个连接只发送少量数据,在 NIO 中实现服务器可能是一个优势。 很少有线程可以处理大量连接(每个请求的线程),因为在给定时间点只有少数连接向服务器发送请求。所以,我们不需要为每个连接维护一个线程。 这是使用 Java TCP NIO 的巨大优势。

而在 UDP 中,每个数据包(数据报)实际上是一个自包含的消息,每个数据包都可以视为一个请求,即使我们使用 NIO 数据报通道,我们仍然需要为每个请求创建一个线程。

那么,使用 NIO Datagram 通道有什么好处呢?

【问题讨论】:

    标签: java sockets io udp nio


    【解决方案1】:

    即使我们使用 NIO 数据报通道,我们仍然需要为每个请求创建一个线程

    为什么?如果您是回显服务器、时间服务器,则不会……这完全取决于您在做什么。

    如果您的应用程序使得客户端不断请求(与一次性请求相反:例如时间或 DNS),您可能会考虑为每个客户端而不是每个请求创建一个线程。

    你的假设经不起推敲。

    然而 NIO 确实是超卖了,而且大多数应用程序都不需要它。有些服务器在阻塞模式下支持数十万个连接。

    【讨论】:

    • 感谢 EJP 的回复!服务器不是回声服务器也不是时间服务器。当这个UDP服务器收到一个UDP包时,它需要处理这个包,并将处理后的数据发送到后台MQ,然后响应客户端。当前,该服务器为每个传入的 UDP 数据包创建一个新线程来处理它。我的问题是如果我们使用 NIO 数据报通道有什么优势和区别。
    • 很少或没有,根据您的描述。
    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 2010-09-24
    • 2010-12-27
    • 2015-04-06
    • 2013-05-09
    • 2017-05-29
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多