将UDP与NIO结合使用有什么意义?

时间:2013-04-16 22:29:03

标签: java networking tcp udp nio

NIO和TCP为很多连接做出了很好的配对。由于需要为每个新客户端打开一个新连接,因此每个客户端通常都需要自己的线程来阻止I / O操作。 NIO通过允许在可能的情况下读取数据来解决该问题,而不是在可用之前阻塞。但是UDP怎么样?

我的意思是,无连接UDP不具有与之关联的TCP的阻塞性质,因为协议的设计方式(基本上是发送并忘记它)。如果我决定将某些数据发送到某个地址,那么它会这样做,没有延迟(在服务器端)。同样,如果我想读取数据,我只能接收来自不同来源的单个数据包。我不需要使用许多线程与许多地方建立许多连接来处理它们。

那么,NIO和选择器如何增强UDP?更具体地说,何时人们更愿意使用UDP与NIO而不是ol'java.net包?

2 个答案:

答案 0 :(得分:8)

DatagramSocket.receive(...)方法记录为阻止操作。因此,例如,如果您有一个尝试处理来自N个不同套接字的数据包的线程,则需要使用NIO和选择器。同样,如果线程必须多路复用检查新数据包与其他活动,您可能会这样做。

如果您没有这些或类似的要求,那么选择器将无济于事。但这与TCP案例没有什么不同。如果不需要,则不应将选择器与TCP一起使用,因为可能会添加额外的系统调用。

(在Linux上,在数据报的情况下,你会进行select系统调用,然后是recv ...而不只是recv。)


  

但是,如果您只处理一个DatagramSocket,那么接收方法在到达时是否会立即读取数据包,而不管它们来自不同的计算机?

如果您正在一个套接字上侦听来自“everyone”的数据报,那么是。如果你有不同的计算机插槽,那么没有。

  

对于TCP注释,有时使用选择器只是因为拥有数千个线程非常需要资源,因为阻塞的TCP服务器需要它。

我们没有讨论这个案子。但是,是的,这是事实。如果在UDP接收上有数千个线程阻塞,情况也是如此。

我的观点是,你有很多线程,或者如果无关紧要,如果一个线程阻塞,那么NIO没有帮助。事实上,它可能会降低性能。

答案 1 :(得分:3)

NIO完全消除了线程的必要性。它允许您在一个线程中处理所有客户端,包括TCP和UDP客户端。

  

无连接UDP没有与之关联的TCP的阻塞特性

那不是真的。接收仍然阻塞,因此可以发送,至少在理论上。