非阻塞UDP I / O与阻止Java中的UDP I / O.
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞UDP I / O与阻止Java中的UDP I / O.相关的知识,希望对你有一定的参考价值。
NIO中的非阻塞TCP / IP SocketChannel
s和Selector
帮助我处理许多线程数量少的TCP / IP连接。但UDP DatagramChannels
怎么样? (我必须承认我对UDP不是很熟悉。)
即使DatagramChannel
未在阻塞模式下运行,UDP发送操作似乎也不会阻塞。是否真的存在DatagramSocket.send(DatagramPacket)
由于拥挤或类似情况而阻塞的情况?我真的很好奇是否存在这样的情况以及生产环境中可能出现的情况。
如果DatagramSocket.send(DatagramPacket)
实际上没有阻止并且我不打算使用连接的DatagramSocket
并仅绑定到一个端口,那么使用DatagramChannel
和Selector
的非阻塞模式没有优势吗?
我已经使用了Java的DatagramSockets,Channels等已经有一段时间了,但我仍然可以给你一些帮助。
UDP协议不像TCP那样建立连接。相反,它只是发送数据并忘记它。如果确保数据真正到达那里很重要,那就是客户的责任。因此,即使您处于阻塞模式,您的发送操作也只会在刷新缓冲区时阻塞。由于UDP对网络一无所知,因此它会尽早将其写出来,而无需检查网络速度,或者它是否实际到达了预期的位置。因此,对您而言,似乎该频道实际上已准备好进行更多发送。
UDP不会阻塞(它只会在将数据传输到操作系统时阻塞)这意味着如果在任何时候下一跳/交换机/机器无法缓冲UDP数据包,它就会丢弃它。在某些情况下,这可能是理想的行为。但这是你需要注意的事情。
UDP也不保证
- 按发送顺序发送数据包。
- 不要打破大包。
- 跨越交换机转发数据包通常,交换机之间的UDP转发是关闭的。
但是UDP确实支持多播,因此可以将相同的数据包传送到一个或多个主机。发件人不知道是否有人收到了数据包。
关于UDP的一个棘手的问题是它大部分时间都可以工作,但有时会以非常难以重现的方式严重失败。因此,即使您进行了一些测试并且看起来有效,您也不应该假设可靠性。
非阻塞UDP主要用于接收端。数据包发送只能因本地情况而延迟:本地流量整形工具,如“游戏网卡”,优先考虑其他流量来源的游戏流量,或过载的网卡(不太可能发生)可能会延迟数据包的发送。一旦退出系统。一旦数据包离开本地接口,它就不再是应用程序的关注点。
以上是关于非阻塞UDP I / O与阻止Java中的UDP I / O.的主要内容,如果未能解决你的问题,请参考以下文章