Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
使用 SocketChannel 时,需要保留读写缓冲区来处理部分写入和读取。
我怀疑在使用 DatagramChannel 时可能不需要它,但信息很少。
故事是什么?
我是否应该反复调用(非阻塞)receive(ByteBuffer),直到我得到一个空值来读取所有等待的数据报?
在非阻塞模式下发送时,我是否可以依靠 send(ByteBuffer, SocketAddress) 发送整个缓冲区或完全拒绝它,或者我是否需要保留部分写入的缓冲区?
数据报的每次读取都是整个数据报,不多也不少。在 java.nio.DatagramChannel.read 的描述中有这样的提示:
如果数据报中的字节数多于给定缓冲区中剩余的字节数,则数据报的其余部分将被静默丢弃
当您处理 SocketChannel 时,它是一个消息流;无法保证每次读取会获得多少数据,因为 TCP 正在重新组装单独的数据包以从另一端重新创建消息。但是对于 UDP(这是您使用 DatagramChannel 读取的内容),每个数据包都是它自己的原子消息。