使用NIO DatagramChannel我需要处理部分读/写数据包吗?

时间:2009-04-01 21:10:33

标签: java sockets datagram

使用SocketChannel时,需要保留读写缓冲区来处理部分写入和读取。

我怀疑使用DatagramChannel时可能不需要,但信息很少。

故事是什么?

我应该反复调用(非阻塞)接收(ByteBuffer),直到我得到一个空值来读取所有等待的数据报?

当以非阻塞模式发送时,我是否可以依赖send(ByteBuffer,SocketAddress)发送整个缓冲区或完全拒绝它,或者我是否需要保留部分写入的缓冲区?

1 个答案:

答案 0 :(得分:5)

每次读取数据报都是整个数据报,仅此而已。在java.nio.DatagramChannel.read的描述中有一个提示:

  

如果有更多的字节   数据报比保留给定的   缓冲然后剩下的   数据报被无声地丢弃

当你处理SocketChannel时,它是一个消息流;由于TCP正在重新组合单独的数据包以重新创建来自另一方的消息,因此无法保证每次读取都会获得多少或多少数据。但是对于UDP(你正在使用DatagramChannel阅读的内容),每个数据包都是它自己的原子消息。