非阻塞写入 Java SocketChannel

Non-blocking writes to Java SocketChannel

如果我获得一个设置为非阻塞模式的 SocketChannel,当我写入通道并且底层套接字缓冲区因另一端跟不上而已满时会发生什么?数据会被丢弃吗?

write() 方法 return 为零,数据保留在 ByteBuffer 中。那时你应该为 OP_WRITE 注册通道,记住输出缓冲区,return 到 select 循环。当通道变为可写时,重试写入,这次只要它完成,即 return 不为零或少于要写入的缓冲区中的剩余字节,注销 OP_WRITE