JavaNIO:IOException:断管是什么意思?

JavaNIO:IOException:断管是什么意思?,java,nio,Java,Nio,对于我的一些Java NIO连接,当我有一个SocketChannel.write(ByteBuffer)调用时,它抛出一个IOException:“断管” 是什么导致“管道破裂”,更重要的是,是否有可能从该状态恢复?如果无法恢复,这似乎是一个好迹象,表明发生了不可逆转的问题,我应该简单地关闭这个套接字连接。这是一个合理的假设吗?当套接字连接仍然正确连接时(而不是在某个点失败的工作连接),是否曾经发生过此IOException 另一方面,在尝试SocketChannel.write()之前总是调

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

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

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


谢谢

管道破裂仅仅意味着连接失败。可以合理地假设这是不可恢复的,然后执行任何所需的清理操作(关闭连接等)。我不相信,你会看到这仅仅是因为连接尚未完成


如果您使用的是非阻塞模式,那么SocketChannel.connect方法将返回false,您需要使用isConnectionPending和finishConnect方法来确保连接完成。我通常会基于工作正常的预期编写代码,然后捕获异常以检测故障,而不是依赖频繁的“断开连接”调用。

您应该假设套接字在另一端已关闭。用IOException的try-catch块包装代码

您可以使用isConnected()确定SocketChannel是否已连接,但在write()调用完成之前,这可能会发生变化。试着在catch块中调用它,看看这是否就是为什么会出现IOException

是什么导致“管道破裂”,更重要的是,是否有可能从该状态恢复

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

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

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

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

当套接字连接仍然正确连接时(而不是在某个点失败的工作连接),是否曾经发生过此
IOException

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


在尝试
SocketChannel.write()之前调用
SocketChannel.isConnected()
是否明智

通常,在使用(外部)资源
r
的调用之前调用
r.isXYZ()。在两次调用之间,资源的状态很可能会发生变化。更好的做法是执行操作,捕获由失败操作导致的
IOException
(或任何内容),并采取所需的任何补救措施


在这种特殊情况下,调用
isConnected()
是没有意义的。如果套接字在过去的某个点连接,则该方法被定义为返回
true
。它不会告诉您连接是否仍然处于活动状态。确定连接是否仍处于活动状态的唯一方法是尝试使用它;e、 g.执行读或写操作。

断管表示您向另一端已关闭的连接进行了写入

isConnected()
未检测到此情况。只有写作才能做到

在尝试SocketChannel.write()之前,始终调用SocketChannel.isConnected()是否明智


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

在这种异常情况下,isConnected()无论如何都返回true。把它读为“插座在过去的某个时候连接了”这个答案的最后一段是完全不正确的。isConnected()未检测到此情况。如果以前没有管道,则无法获取损坏的管道。如果之前没有连接,则无法获得失败的连接。这个答案的最后一段是正确的,但不相关。