NIO和TCP为很多连接做出了很好的配对。由于需要为每个新客户端打开一个新连接,因此每个客户端通常都需要自己的线程来阻止I / O操作。 NIO通过允许在可能的情况下读取数据来解决该问题,而不是在可用之前阻塞。但是UDP怎么样?
我的意思是,无连接UDP不具有与之关联的TCP的阻塞性质,因为协议的设计方式(基本上是发送并忘记它)。如果我决定将某些数据发送到某个地址,那么它会这样做,没有延迟(在服务器端)。同样,如果我想读取数据,我只能接收来自不同来源的单个数据包。我不需要使用许多线程与许多地方建立许多连接来处理它们。
那么,NIO和选择器如何增强UDP?更具体地说,何时人们更愿意使用UDP与NIO而不是ol'java.net
包?
答案 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的阻塞特性
那不是真的。接收仍然阻塞,因此可以发送,至少在理论上。