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