Java NIO:IOException:损坏的管道是什么意思? [复制]

2023-12-23

对于我的一些 Java NIO 连接,当我有SocketChannel.write(ByteBuffer)调用,它会抛出一个IOException:“管道破损”。

是什么导致“管道破裂”,更重要的是,是否有可能从该状态恢复?如果无法恢复,这似乎是一个好兆头,表明发生了不可逆转的问题,我应该简单地关闭此套接字连接。这是一个合理的假设吗?是否有过这样的时刻IOException当套接字连接仍然正确连接时(而不是在某个时刻失败的工作连接)时会发生吗?

顺便说一句,总是打电话是明智的吗?SocketChannel.isConnected()在尝试之前SocketChannel.write(),如果是这样,我是否还可以假设连接已“断开”,并且如果两者都应关闭SocketChannel.isConnected() and SocketChannel.isConnectionPending()都是false?

Thanks!


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

这是由导致连接关闭的原因引起的。 (不是您的应用程序关闭了连接:这会导致不同的异常。)

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

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

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

是否有过这样的时刻IOException当套接字连接仍然正确连接时(而不是在某个时刻失败的工作连接)时会发生吗?

不会。(或者至少,不会破坏操作系统网络堆栈、JVM 和/或您的应用程序的正确行为。)


总是打电话明智吗SocketChannel.isConnected()在尝试之前SocketChannel.write() ...

一般来说,打电话是个坏主意r.isXYZ()在使用(外部)资源的某些调用之前r。资源状态发生改变的可能性很小between两个电话。更好的主意是采取行动,抓住机会IOException(或其他)因失败的操作而导致的结果,并采取所需的任何补救措施。

在这种特殊情况下,调用isConnected()毫无意义。该方法被定义为返回true 如果套接字在过去的某个时刻连接过。它不会告诉您连接是否仍然有效。确定连接是否仍然有效的唯一方法是尝试使用它;例如进行读取或写入。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java NIO:IOException:损坏的管道是什么意思? [复制] 的相关文章

随机推荐