2013-03-07 80 views
3

非阻塞读取和阻塞读取之间的区别很明显,但我对写入感到困惑。我知道一个非阻塞写入永远不会阻塞(杜!)。如果底层套接字缓冲区已满,则不会将字节写入它。这就是为什么在调用channel.write时检查写入了多少字节的原因。Java中的阻塞套接字写入和非阻塞套接字写入有什么区别?

现在怎么样阻止写入?它什么时候阻止?当你调用flush时?当你在其OutputStream上调用write时?在底层写入套接字缓冲区中有空间之前是否会阻塞?或者如果它不能写就会抛出异常?

+0

http://stackoverflow.com/questions/8086930/non-blocking-socket-writes-in-java-versus-blocking-socket-writes – yadab 2013-03-07 20:17:29

+0

还有异步写入... – irreputable 2013-03-07 20:31:08

+0

@irreputable异步写入不是封锁写我会想。 – chrisapotek 2013-03-07 20:32:15

回答

2

是的,它确实阻塞,直到有一个在底层操作系统套接字发送缓冲区足够的空间来复制你的字节,即当你把数据转换成Java OutputStream与插座,或当你调用flush(),取其所调用相关的可能发生系统调用实际的write(2)

+0

Humm,因此无法知道对flush()的调用是否会永久使用?这很糟糕...问题是没有办法让套接字写入非阻塞,同时保持对读取的阻塞,对吧? – chrisapotek 2013-03-07 20:20:23

+0

不,这是一个单一的二进制开关。 – 2013-03-07 20:58:41