Java NIO SocketChannel IOException:管道损坏

Java NIO SocketChannel IOException: Broken pipe

Stephen C 的回答 here 很好地描述了这个问题。他说 B​​roken pipe exception 是由导致连接关闭的原因引起的,而不是应用程序。我想知道这 "something" 一般是什么导致连接关闭?有哪些可能的处理方法?

我的使用环境: 我在 Azure 上的一组机器上 运行 我的应用程序,它们都在与其中一台机器通信。我几乎总是收到这个错误。

TCP 超时可能是原因之一吗?如果是,那么如何使套接字通道(影响它们后面的套接字运行)永远不会因 TCP 超时而关闭?

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

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

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

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