随记:Nio 中 SelectionKey.OP_WRITE 的使用

38 阅读1分钟
  • nio 中,调用 SocketChannel#write(ByteBuf) 返回通道不可写时(比如受限于带宽,缓冲区已满,非阻塞的 socket 直接返回 0,造成数据丢失),这时候重新写也大概率是失败。
  • 面对以上这种情况,可以为该 channel 注册 SelectionKey.OP_WRITE 事件,交给 Selector 去轮询是否可以写入。
  • 后续增加写入前先判断该通道是否注册了 SelectionKey.OP_WRITE 事件的逻辑,为 true 则表示该通道目前不可用,就不向该通道写入数据。
  • 该情况直到在 Selector 上轮询到 SelectionKey.OP_WRITE 事件,这时候通道可写,再将数据写入缓冲区,同时注销 SelectionKey.OP_WRITE