假设我在服务器上有一个SocketChannel,等待OP_READ准备就绪,并且客户端上有一个SocketChannel,它在缓冲区上使用一个写调用来向服务器发送数据。是否保证OP_READ只有在客户端发送的所有数据到达后才会准备就绪?
答案 0 :(得分:1)
是否保证OP_READ只有在客户端发送的所有数据到达后才会准备就绪?
简答:不。
答案很长:
只要至少有一个字节可供读取,接收通道就会就绪。字节通常一次可用多个,但一般来说,不能保证整个缓冲区的字节数将被分割,当然也不能确保在接收通道信号准备就绪之前所有字节都会到达。数据可以在写入侧和读取侧的多个点处分开。这与发送者数量,接收者数量或资源争用几乎没有关系。
细节在某种程度上取决于底层网络协议 - 例如,几乎所有的注意都是关于流类型协议(如TCP)的,但数据报类型协议(如UDP)应该会给你带来的类型你似乎想要的一次性行为。但是,UDP特别不能提供有保证的传送,因此在这种情况下您需要处理不同的问题。通道抽象更适合流式协议。