使用NIO DatagramChannel,我是否需要处理部分读取/写入的数据包?

3
使用SocketChannel时,需要保留读取和写入缓冲区,以处理部分写入和读取。对于DatagramChannel是否需要保留这些缓冲区,信息较少,具体情况不明。
在使用非阻塞模式下的DatagramChannel时,我是否需要重复调用receive(ByteBuffer)直到获取null返回来读取所有等待的数据报?
在以非阻塞模式发送数据时,我能否依赖于send(ByteBuffer, SocketAddress)发送整个缓冲区或者完全拒绝发送它,或者我需要可能保留部分写入的缓冲区?
1个回答

6
每次读取Datagram都是完整的数据报,没有多余或缺失。在java.nio.DatagramChannel.read的描述中有提示:
如果数据报中的字节数比给定缓冲区中剩余的字节数多,则数据报的其余部分将被静默丢弃。
当您处理SocketChannel时,它是一个消息流;无法保证每次读取的数据量大小,因为TCP正在重新组装单独的数据包以从另一侧重建消息。但对于UDP(您使用DatagramChannel读取的内容),每个数据包都是自己的原子消息。

写操作呢?如果传出缓冲区已满,是否会出现部分写入的情况,还是只有全盘接受或拒绝的可能性? - Nuoji
这也是全有或全无的。如果您尝试编写比数据报大的内容,我不确定会发生什么(异常?),但肯定不会被发送。请注意,单个UDP数据报几乎有64k。 - Jared Oberhaus
另外需要注意的是:不能保证数据报在另一端被传递,但通常它们会被传递。此外,Windows 似乎无法发送超过网络 MTU 的广播 UDP 数据报,因此要小心。 - Jared Oberhaus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接