【问题标题】:Using NIO DatagramChannel will I need to handle partially read/written packets?使用 NIO DatagramChannel 是否需要处理部分读/写的数据包?
【发布时间】:2009-04-01 21:10:33
【问题描述】:

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

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

故事是什么?

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

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

【问题讨论】:

    标签: java sockets datagram


    【解决方案1】:

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

    如果有更多的字节 数据报比保留在给定的 缓冲区然后的其余部分 数据报被静默丢弃

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

    【讨论】:

    • 写呢?由于传出缓冲区已满,是否会出现部分写入,或者这也是全有或全无的事情?
    • 这也是全部或全部。如果您尝试编写比数据报更大的东西,我不确定会发生什么(例外?),但肯定不会发送。请注意,单个 UDP 数据报有将近 64k。
    • 另外几个注意事项:不能保证数据报会在另一端传递,但通常它们会传递。此外,Windows 似乎无法发送超过网络 MTU 的广播 UDP 数据报,因此请注意这一点。
    猜你喜欢
    • 2019-10-24
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多