使用SocketChannel时,需要保留读写缓冲区来处理部分写入和读取。
我怀疑使用DatagramChannel时可能不需要,但信息很少。
故事是什么?
我应该反复调用(非阻塞)接收(ByteBuffer),直到我得到一个空值来读取所有等待的数据报?
当以非阻塞模式发送时,我是否可以依赖send(ByteBuffer,SocketAddress)发送整个缓冲区或完全拒绝它,或者我是否需要保留部分写入的缓冲区?
答案 0 :(得分:5)
每次读取数据报都是整个数据报,仅此而已。在java.nio.DatagramChannel.read的描述中有一个提示:
如果有更多的字节 数据报比保留给定的 缓冲然后剩下的 数据报被无声地丢弃
当你处理SocketChannel时,它是一个消息流;由于TCP正在重新组合单独的数据包以重新创建来自另一方的消息,因此无法保证每次读取都会获得多少或多少数据。但是对于UDP(你正在使用DatagramChannel阅读的内容),每个数据包都是它自己的原子消息。