OP_READ只在SocketChannel.write()完成时才准备好?

时间:2015-10-06 14:33:43

标签: java nio

假设我在服务器上有一个SocketChannel,等待OP_READ准备就绪,并且客户端上有一个SocketChannel,它在缓冲区上使用一个写调用来向服务器发送数据。是否保证OP_READ只有在客户端发送的所有数据到达后才会准备就绪?

1 个答案:

答案 0 :(得分:1)

  

是否保证OP_READ只有在客户端发送的所有数据到达后才会准备就绪?

简答:不。

答案很长:

只要至少有一个字节可供读取,接收通道就会就绪。字节通常一次可用多个,但一般来说,不能保证整个缓冲区的字节数将被分割,当然也不能确保在接收通道信号准备就绪之前所有字节都会到达。数据可以在写入侧和读取侧的多个点处分开。这与发送者数量,接收者数量或资源争用几乎没有关系。

细节在某种程度上取决于底层网络协议 - 例如,几乎所有的注意都是关于流类型协议(如TCP)的,但数据报类型协议(如UDP)应该会给你带来的类型你似乎想要的一次性行为。但是,UDP特别不能提供有保证的传送,因此在这种情况下您需要处理不同的问题。通道抽象更适合流式协议。