【问题标题】:What is the difference between a blocking socket write and a non-blocking socket write in Java?Java中的阻塞套接字写入和非阻塞套接字写入有什么区别?
【发布时间】:2013-02-23 05:03:24
【问题描述】:

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

现在阻止写入怎么样?什么时候阻塞?当你叫冲洗?当你在它的OutputStream上调用write?它会阻塞直到底层写入套接字缓冲区中有空间吗?还是写不出来会抛出异常吗?

【问题讨论】:

  • 还有异步写入...
  • @irreputable 异步写入我认为是非阻塞写入。
  • 不准确。这 3 种模式彼此完全不同。
  • @irreputable 异步写入和非阻塞写入有什么区别?异步写入是否以某种方式给你一个回调?我从未在 Java 中见过这种情况。你有一个例子的链接吗?

标签: java sockets real-time nio nonblocking


【解决方案1】:

是的,它确实会阻塞,直到底层操作系统套接字发送缓冲区中有足够的空间来复制您的字节。当您将数据放入与套接字关联的 Java OutputStream 或调用 flush() 时,可能会发生这种情况,以调用实际的write(2) 系统调用为准。

【讨论】:

  • 嗯,所以没有办法知道对 flush() 的调用是否会永远持续下去?太糟糕了......问题是没有办法让套接字写入非阻塞同时保持读取阻塞,对吧?
  • 不,这是一个二进制开关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
相关资源
最近更新 更多