对于我的一些Java NIO连接,当我有一个SocketChannel.write(ByteBuffer)调用时,它抛出一个IOException:"Broken pipe".
什么原因导致"管道破裂",更重要的是,是否有可能从该状态恢复?如果它无法恢复,似乎这是一个好的迹象,表明发生了不可逆转的问题,我应该简单地关闭这个套接字连接.这是一个合理的假设吗?是否曾经有一段时间,当IOException套接字连接仍然在第一个地方正确连接时(而不是某个时候失败的工作连接)会发生这种情况?
在一个侧面说明,它是明智的做法始终调用SocketChannel.isConnected()在尝试之前SocketChannel.write(),如果是这样,可以同时假设该连接是"破",如果两者都应该被关闭SocketChannel.isConnected(),并SocketChannel.isConnectionPending()都false?
谢谢!
Ste*_*n C 98
什么导致"破管",更重要的是,是否可以从该状态恢复?
它是由导致连接关闭的东西引起的.(关闭连接不是你的应用程序:这会导致一个不同的异常.)
无法恢复连接.你需要开一个新的.
如果它无法恢复,似乎这是一个好的迹象,表明发生了不可逆转的问题,我应该简单地关闭这个套接字连接.这是一个合理的假设吗?
是.一旦收到该异常,套接字将无法再次运行.关闭它是唯一明智的做法.
是否曾经有一段时间,当
IOException套接字连接仍然在第一个地方正确连接时(而不是某个时候失败的工作连接)会发生这种情况?
不.(或者至少,并非没有颠覆OS网络堆栈,JVM和/或您的应用程序的正确行为.)
SocketChannel.isConnected()在尝试SocketChannel.write()...... 之前总是打电话是明智的吗?
通常,r.isXYZ()在使用(外部)资源的某个调用之前调用是个坏主意r.资源状态很可能在两次调用之间发生变化.最好的做法是采取行动,抓住因IOException行动失败而产生的(或其他),并采取任何必要的补救措施.
在这种特殊情况下,呼叫isConnected()是没有意义的.该方法被定义为true 在过去的某个时刻连接套接字时返回.它不会告诉您连接是否仍然有效.确定连接是否仍然存在的唯一方法是尝试使用它; 例如,做一个读或写.
jsi*_*ght 23
断管只是意味着连接失败.可以合理地假设这是不可恢复的,然后执行任何所需的清理操作(关闭连接等).我不相信你会因为连接尚未完成而看到这一点.
如果使用非阻塞模式,则SocketChannel.connect方法将返回false,您将需要使用isConnectionPending和finishConnect方法来确保连接完成.我通常会根据事情的预期进行编码,然后捕获异常以检测故障,而不是依赖频繁调用"isConnected".
use*_*421 19
断开的管道意味着您已写入已被另一端关闭的连接.
isConnected()没有检测到这种情况.只写一次.
在尝试SocketChannel.write()之前总是调用SocketChannel.isConnected()是明智的吗?
这毫无意义.该插座本身就是连接.你连接了它.什么可能无法连接是连接本身,你只能判断为通过尝试它.