【发布时间】:2015-10-06 14:33:42
【问题描述】:
假设我在服务器上有一个 SocketChannel 等待 OP_READ 准备好,在客户端上有一个 SocketChannel,它使用缓冲区上的 ONE 写入调用将数据发送到服务器。那么是否保证只有在客户端发送的所有数据都到达时 OP_READ 才准备好?
【问题讨论】:
假设我在服务器上有一个 SocketChannel 等待 OP_READ 准备好,在客户端上有一个 SocketChannel,它使用缓冲区上的 ONE 写入调用将数据发送到服务器。那么是否保证只有在客户端发送的所有数据都到达时 OP_READ 才准备好?
【问题讨论】:
那么是否保证 OP_READ 仅在客户端发送的所有数据到达后才准备就绪?
简短回答:不。
长答案:
只要至少有一个字节可供读取,接收通道就会准备就绪。字节通常一次可用多个字节,但一般来说,不能保证整个缓冲区中的字节将如何被分割,当然也不能保证所有字节都会在接收通道发出准备就绪信号之前到达。数据可以在写入侧和读取侧的多个点处拆分。这与发送者的数量、接收者的数量或资源争用无关。
细节在一定程度上取决于底层网络协议——例如,对于 TCP 等流类型协议,几乎所有的赌注都失败了,但 UDP 等数据报类型协议应该给你那种您似乎想要的一次性行为。但是,尤其是 UDP,它不提供保证交付,因此在这种情况下您需要处理不同的问题。通道抽象更适合流式协议。
【讨论】: