NIO中的非阻塞TCP/IP SocketChannel
和Selector
可以帮助我处理大量线程数较少的TCP/IP连接。但是UDP DatagramChannels
怎么样呢?(我必须承认我对UDP不是很熟悉。)
即使DatagramChannel
未在阻塞模式下运行,UDP send操作似乎也不会阻塞。是否真的存在由于拥塞或类似原因而导致DatagramSocket.send(DatagramPacket)
阻塞的情况?我真的很好奇是否有这样的情况,以及在生产环境中可能存在的情况。
如果DatagramSocket.send(DatagramPacket)
实际上不阻塞,并且我不打算使用已连接的DatagramSocket
并仅绑定到一个端口,那么对DatagramChannel
和Selector
使用非阻塞模式是否没有优势
发布于 2009-02-20 13:48:41
我已经有一段时间没有使用Java的DatagramSockets、Channels和类似的东西了,但我仍然可以给你一些帮助。
UDP协议不像TCP那样建立连接。相反,它只是发送数据,然后忘记它。如果确保数据真正到达那里很重要,那就是客户的责任。因此,即使您处于阻塞模式,您的发送操作也只会在刷新缓冲区所需的时间内阻塞。由于UDP对网络一无所知,因此它会在第一时间将其写出来,而不会检查网络速度或是否实际到达了它应该到达的位置。因此,对于您来说,似乎通道实际上立即准备好进行更多的发送。
发布于 2013-04-10 17:07:12
非阻塞UDP在接收端最有用。分组发送只能由于本地环境而被延迟:本地业务整形工具,如将游戏业务优先于其他业务源的“游戏网卡”,或者过载的网卡(这不太可能发生)可以延迟分组的发送。一旦被排除在系统之外。一旦数据包离开本地接口,它就不再是应用程序关心的问题。
https://stackoverflow.com/questions/569555
复制相似问题