对于我的一些 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(使用前将#替换为@)