有人为什么会更喜欢阻塞写而不是非阻塞写呢?我理解的是,只有在希望在写入方法返回后确保对方收到TCP数据包时,才需要使用阻塞写。但我甚至不确定这是否可能。您需要刷新并且必须清空底层操作系统写套接字缓冲区。那么,非阻塞套接字写入有什么劣势吗?从性能角度来看,底层写套接字缓冲区越大,是否不好呢?我的理解是,底层套接字写缓冲区越小,就越容易遇到慢速/有问题的客户端,在应用程序级别下,必须在底层套接字缓冲区已满且isWritable()返回false时丢弃/排队数据包。
// non-blocking write
while(bb.remaining() > 0) sc.write(bb);
或者
// blocking write
sc.write(bb);
第一个方法可能会占用CPU,而第二个方法则更可取。
最大的问题在于读取。一旦您决定是要使用阻塞或非阻塞读取,您的写入方式也必须相同。不幸的是,无法将它们设置为不同的方式。如果您想使用非阻塞读取,则必须使用非阻塞写入。
select()
和OP_WRITE
是“无事可做”的解决方案。 - user207421