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。