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

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

是什么原因导致了“断pipe”,更重要的是,是否有可能从这个状态中恢复? 如果无法恢复,看起来这是一个不错的信号,说明发生了一个不可逆转的问题,我应该closures这个套接字连接。 这是一个合理的假设吗? 是否曾经有一段时间这个IOException会发生,而套接字连接仍然是正确连接(而不是在某个时候失败的工作连接)?

请注意,在尝试SocketChannel.isConnected()之前始终调用SocketChannel.isConnected()是明智的做法,如果可以,我还可以假定连接是“断开”的,如果SocketChannel.isConnected()SocketChannel.isConnectionPending()都是false

谢谢!

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

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

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

如果无法恢复,看起来这是一个不错的信号,说明发生了一个不可逆转的问题,我应该closures这个套接字连接。 这是一个合理的假设吗?

是。 一旦收到该exception,套接字将无法再次工作。 closures它是唯一明智的做法。

是否曾经有一段时间这个IOException会发生,而套接字连接仍然是正确连接(而不是在某个时候失败的工作连接)?

没有(或者至less,不能颠覆操作系统的networking堆栈,JVM和/或你的应用程序的正确行为)。


在尝试SocketChannel.isConnected()之前始终调用SocketChannel.isConnected()是明智之举…

通常,在使用(外部)资源r某个调用之前调用r.isXYZ()是一个好主意。 两次调用之间的资源状态有一点变化。 做这个动作是更好的办法,捕捉失败动作导致的IOException (或其他),并采取任何需要的补救措施。

在这种情况下,调用isConnected()是毫无意义的。 该方法被定义为在过去某个时间点连接了套接字的情况下返回true 。 它不会告诉你连接是否仍然有效。 确定连接是否还活着的唯一方法是尝试使用它; 例如做一个读或写。

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

如果您使用的是非阻塞模式,那么SocketChannel.connect方法将返回false,您将需要使用isConnectionPending和finishConnect方法来确保连接已完成。 我通常会根据预期的东西将工作,然后捕捉exception来检测失败,而不是依靠频繁的调用“isConnected”。

断开的pipe道意味着你写了一个已经被另一端closures的连接。

isConnected()不检测这种情况。 只有一个写。

在尝试SocketChannel.write()之前始终调用SocketChannel.isConnected()是明智的做法。

这是毫无意义的。 sockets本身连接。 你连接了它。 可能没有连接的是连接本身,只能通过尝试来确定。

你应该假设在另一端closures了套接字。 对于IOException,使用try catch块封装代码。

您可以使用isConnected()来确定SocketChannel是否连接,但在write()调用完成之前可能会更改。 尝试在你的catch块中调用它,看看实际上这是为什么你会得到IOException。