Java NIO:IOException: Broken Pipe是什么意思?

2022-08-31 10:43:59

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

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

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

谢谢!


答案 1

是什么原因导致“管道破裂”,更重要的是,是否有可能从这种状态中恢复过来?

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

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

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

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

当套接字连接仍然首先正确连接(而不是在某些时候失败的工作连接)时,是否曾经发生这种情况?IOException

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


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

通常,在使用(外部)资源的某个调用之前调用是一个坏主意。资源状态在两次调用之间更改的可能性很小。更好的做法是采取行动,抓住失败行动导致的(或其他任何事情),并采取任何需要的补救措施。r.isXYZ()rIOException

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


答案 2

管道损坏仅表示连接失败。可以合理地假设这是不可恢复的,然后执行任何必需的清理操作(关闭连接等)。我不相信你会仅仅因为连接尚未完成而看到这一点。

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


推荐