Java中的非阻塞套接字写入与阻塞套接字写入相比

chr*_*tek 6 java sockets networking nio tcp

为什么有人更喜欢阻止写入非阻塞写入?我的理解是,如果你想确保另一方在写入方法返回后获得TCP数据包,你只想要阻塞写入,但我甚至不确定是否可能.你必须刷新和刷新必须刷新底层操作系统写入套接字缓冲区.那么非阻塞套接字写入有什么缺点吗?有一个大的底层写入套接字缓冲在性能方面是一个坏主意吗?我的理解是,底层套接字写缓冲区越小,你就越有可能遇到慢/错误的客户端,并且在底层套接字缓冲区已满且isWritable()返回false时,必须在应用程序级别中丢弃/排队数据包.

use*_*421 7

我的理解是,如果你想确保一旦返回write方法,另一方得到TCP数据包,你只想要阻塞写

你的理解是不正确的.它无法确保这一点.

阻塞写入阻塞,直到所有数据都已传输到套接字发送缓冲区,从那里异步传输到网络.如果读取器很慢,他的套接字接收缓冲区将填满,这最终会导致套接字发送缓冲区填满,这将导致阻塞写入阻塞,阻塞整个线程.非阻塞I/O为您提供了一种检测和处理这种情况的方法.

  • @chrisapotek.(1)有空间的缓冲区(2)OP_WRITE触发的select()(3)isWritable()返回真(4)你输入的循环(5)第一次写入充满套接字发送缓冲区(5)有更多的留在ByteBuffer中的数据所以(6)你再次迭代循环,写入返回零,与(5)相同数量的数据仍然存在,所以(7)你再次迭代循环...阻塞的情况当每个客户端有一个线程时,写入更可取. (2认同)