使用socket 获取流读取 时报错java.net.SocketException: Software caused connection abort: recv failed

场景:

   使用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;        

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,"jedis java.net.SocketException: Software caused connection abort"异常通常是由于网络连接问题或Redis服务器故障引起的。这个异常表示在与Redis服务器建立连接时,连接被意外中断或终止。 以下是一些可能导致此异常的原因和解决方法: 1. 网络连接问题:检查网络连接是否正常,确保可以正常访问Redis服务器。可以尝试使用ping命令来测试与Redis服务器的连接。 2. Redis服务器故障:如果Redis服务器出现故障或崩溃,可能会导致连接中断。在这种情况下,需要检查Redis服务器的日志文件以获取更多信息,并尝试重新启动Redis服务器。 3. 连接超时:如果连接超时时间设置得太短,可能会导致连接中断。可以尝试增加连接超时时间来解决此问题。在Jedis客户端中,可以使用`JedisPoolConfig`类的`setConnectionTimeout`方法来设置连接超时时间。 4. 连接池问题:如果使用连接池管理连接,可能会出现连接池耗尽或连接泄漏的问题。可以尝试增加连接池的最大连接数或检查代码中是否正确释放连接。 5. 防火墙或代理问题:防火墙或代理服务器可能会阻止与Redis服务器的连接。请确保防火墙或代理服务器允许与Redis服务器的通信。 请注意,以上是一些常见的解决方法,具体的解决方法可能因环境和具体情况而异。如果问题仍然存在,请提供更多详细信息以便进一步帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值