Java NIO SocketChannel IOException:管道损坏

时间:2016-06-03 06:17:13

标签: java sockets azure tcp nonblocking

Stephen C的答案here很好地描述了这个问题。他说断管异常是由导致连接关闭的东西造成的,而不是应用程序。我想知道所有这些“东西”一般是什么,这导致连接关闭?处理它们的可能方法是什么?

我的使用环境: 我正在Azure上的一组计算机上运行我的应用程序,并且所有这些都正在与其中一台计算机通信。我几乎总是得到这个错误。

TCP超时可能是其中一个原因吗?如果是,那么如何使套接字通道(影响Socket在它们后面运行)从不关闭TCP超时的会费?

2 个答案:

答案 0 :(得分:2)

当客户端远离正在侦听的套接字时,会出现断管异常。这可能是由于服务器响应缓慢导致客户端达到套接字超时。比方说,如果是浏览器,任何http请求需要很长时间才能响应并且用户关闭浏览器,应用程序日志中将显示损坏的管道异常。

现在要解决此问题,要么增加套接字超时,要么修复服务器响应。

答案 1 :(得分:2)

您可以获取与SocketChannel关联的套接字,然后设置其keepAlive属性。这样的事情。

SocketChannel sockChannel;
/*
connect here
*/    
sockChannel.socket().setKeepAlive(true);