3

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

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

故事是什么?

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

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

4

1 回答 1

5

数据报的每次读取都是整个数据报,不多也不少。在 java.nio.DatagramChannel.read 的描述中有这样的提示:

如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃

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

于 2009-04-01T21:25:48.870 回答