场景:
使用socket 进行通信 循环读取信息的时候报错java.net.SocketException: Software caused connection abort: recv failed
大概原因:
客户机<-->服务器,之间是由一个socket 长连接来通信,客户端有一个接收线程在while(true){..}循环里不停地从InputStream流中读数据,客户机每隔几秒钟发一次心跳包至服务端,如果连续未收到心跳包响应的次数已达到规定的次数,客户机认为此链路异常,将socket关闭,那么服务器会抛出java.net.SocketException: Connection reset by peer异常,然后分配给此socket连接的线程退出,那么客户端在while(true){..}循环,读取流时便会发java.net.SocketException:Software caused connection abort: recv failed异常。
简单说就是:循环读取信息的时候 InputStream 流异常关闭,但是你还从里面读取,所以要报错
解决方案:
每次读取信息的时候 检查是否还是连接状态:
使用available()方法, 返回大于0的表示连接,小于等于0 的是关闭连接
简单代码:
while((len = is.read(bytes)) != -1) {
.......!
最后判断下连接状态:
if(is.available()<=0) break;
}