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

OP_READ only ready when SocketChannel.write() completes?

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

Is it then guaranteed that OP_READ will only be ready once ALL data that the client sent has arrived?

简答:没有。

长答案:

只要至少有一个字节可供读取,接收通道就会准备就绪。通常一次会有多个字节可用,但一般来说,无法保证整个充满字节的缓冲区将如何拆分,当然 none 所有字节都将在接收通道信号之前到达准备。数据可以在写入端和读取端的多个点上拆分。这与发送者数量、接收者数量或资源争用无关。

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