Java NIO:什么是IOException:断开的管道是什么意思?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (98)

对于我的一些Java NIO连接,当我SocketChannel.write(ByteBuffer)打电话时,会抛出一个IOException:“ 断开的管道”。

是什么引起了“破损的管道”,更重要的是,是否有可能从该状态中恢复?如果它无法恢复,似乎这将是一个好兆头,已经发生了不可逆转的问题,我应该简单地关闭此套接字连接。这是一个合理的假设吗?是否曾经有过这样的IOException情况:套接字连接在第一时间仍然正确连接(而不是在某个时间点失效的工作连接)?

在一个侧面说明中,SocketChannel.isConnected()在尝试a之前总是打电话是明智的SocketChannel.write(),如果可以的话,我是否也可以假设连接已“断开”,并且如果两者都是SocketChannel.isConnected()并且SocketChannel.isConnectionPending()都应该关闭false

提问于
用户回答回答于

断开的管道只是意味着连接失败。假设这是不可恢复的,然后执行所需的清理操作(关闭连接等)是合理的。我不相信你会看到这仅仅是由于连接尚未完成。

如果您使用的是非阻塞模式,那么SocketChannel.connect方法将返回false,您将需要使用isConnectionPending和finishConnect方法来确保连接完成。我通常会根据事情会发生作用的期望进行编码,然后捕获异常来检测失败,而不是依赖频繁调用“isConnected”。

用户回答回答于

是什么导致了“broken pipe”,更重要的是,是否有可能从该状态中恢复?

它是由导致连接关闭的东西引起的。(这不是你的应用程序关闭连接:这会导致不同的例外。)

无法恢复连接。你需要打开一个新的。

如果它无法恢复,似乎这将是一个好兆头,已经发生了不可逆转的问题,我应该简单地关闭此套接字连接。这是一个合理的假设吗?

是。一旦收到该异常,套接字将无法再工作。关闭它是唯一明智的做法。

是否曾经有过这样的IOException情况:套接字连接在第一时间仍然正确连接(而不是在某个时间点失效的工作连接)?

不可以(或者至少,不能颠覆操作系统网络堆栈,JVM和/或应用程序的正确行为。)

SocketChannel.isConnected()在尝试SocketChannel.write()...... 之前始终打电话是明智之举......

一般来说,r.isXYZ()在使用(外部)资源的某个调用之前调用它是个坏主意r。资源状态在两次调用之间有一点变化。采取行动,抓住IOException失败行动所产生的(或其他)并采取必要的补救行动是一个更好的主意。

在这个特殊情况下,呼叫isConnected()是毫无意义的。该方法被定义为true 在过去的某个点连接套接字时返回。它不会告诉你连接是否仍处于活动状态。确定连接是否还活着的唯一方法是尝试使用它; 例如做一个读或写。

扫码关注云+社区