Java NIO SocketChannel IOException:管道损坏
Java NIO SocketChannel IOException: Broken pipe
Stephen C 的回答 here 很好地描述了这个问题。他说 Broken pipe exception 是由导致连接关闭的原因引起的,而不是应用程序。我想知道这 "something" 一般是什么导致连接关闭?有哪些可能的处理方法?
我的使用环境:
我在 Azure 上的一组机器上 运行 我的应用程序,它们都在与其中一台机器通信。我几乎总是收到这个错误。
TCP 超时可能是原因之一吗?如果是,那么如何使套接字通道(影响它们后面的套接字运行)永远不会因 TCP 超时而关闭?
只要客户端离开它正在侦听的套接字,就会出现断管异常。这可能是由于服务器响应缓慢而在客户端达到套接字超时。比如说,在浏览器的情况下,如果任何 http 请求需要很长时间才能响应并且用户关闭浏览器,应用程序日志中将显示一个破损的管道异常。
现在要解决此问题,您可以增加套接字超时或修复服务器响应。
您可以获取与SocketChannel关联的套接字,然后设置其keepAlive属性。像这样。
SocketChannel sockChannel;
/*
connect here
*/
sockChannel.socket().setKeepAlive(true);
Stephen C 的回答 here 很好地描述了这个问题。他说 Broken pipe exception 是由导致连接关闭的原因引起的,而不是应用程序。我想知道这 "something" 一般是什么导致连接关闭?有哪些可能的处理方法?
我的使用环境: 我在 Azure 上的一组机器上 运行 我的应用程序,它们都在与其中一台机器通信。我几乎总是收到这个错误。
TCP 超时可能是原因之一吗?如果是,那么如何使套接字通道(影响它们后面的套接字运行)永远不会因 TCP 超时而关闭?
只要客户端离开它正在侦听的套接字,就会出现断管异常。这可能是由于服务器响应缓慢而在客户端达到套接字超时。比如说,在浏览器的情况下,如果任何 http 请求需要很长时间才能响应并且用户关闭浏览器,应用程序日志中将显示一个破损的管道异常。
现在要解决此问题,您可以增加套接字超时或修复服务器响应。
您可以获取与SocketChannel关联的套接字,然后设置其keepAlive属性。像这样。
SocketChannel sockChannel;
/*
connect here
*/
sockChannel.socket().setKeepAlive(true);