NIO:OP_READ并没有读取所有数据; OP_READ是否保持准备状态?

时间:2017-09-11 09:02:11

标签: java nio

想象一下具有32KB套接字接收缓冲区的套接字通道。

正在接收24KB数据,OP_READ设置在就绪集中,并通知IO线程处理传入数据。

通常使用bytebuffer调用socketchannel.read,该bytebuffer能够完全存储套接字接收缓冲区的内容。

但现在我的问题是:

当bytebuffer不足以读取所有数据时会发生什么,例如。一个16KB的字节缓冲区,因此在套接字接收缓冲区中保留8KB。只要数据保留在套接字的套接字缓冲区中,OP_READ是否会从就绪集中移除,或者OP_READ是否保留在就绪集中。

1 个答案:

答案 0 :(得分:2)

  

通常使用bytebuffer调用socketchannel.read,该bytebuffer能够完全存储套接字接收缓冲区的内容。

不,不是。它被调用ByteBuffer,其大小足以接收此时应用程序准备接收的任何内容。

  

当bytebuffer不足以读取所有数据时会发生什么,例如。一个16KB的字节缓冲区,因此在套接字接收缓冲区中保留8KB。 OP_READ是否会从就绪集

中删除

没有

  

或者只要数据保留在套接字的套接字缓冲区中,OP_READ是否仍保留在就绪集中。

不,当您删除它时,它会从就绪集中删除,但是如果下一个select()的套接字接收缓冲区中仍有数据,则已恢复准备就绪。