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