android手机连接无线模块几小时后发生Software caused connection abort异常 导致连接被拒绝 怎么解决 200

无线模块(ESP8266)一直发数据给安卓手机(数据有4k采集间隔300ms)几个小时后就报Softwarecausedconnectionabort异常然后再报conn... 无线模块(ESP8266)一直发数据给安卓手机 (数据有4k 采集间隔300ms) 几个小时后 就报Software caused connection abort异常 然后再报 connection refuse 求解决
并且出异常以后 必须重启无线模块才能继续采集数据, 用的手机是小米5plus
展开
 我来答
福井换暂
2018-04-28 · TA获得超过6492个赞
知道大有可为答主
回答量:5307
采纳率:88%
帮助的人:693万
展开全部
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocketInputStream.read(SocketInputStream.java:182)

发生这个异常,从异常提示看是由于程序引起的,而非网络方面的原因,引发该异常的
场景之一:
客户机<-->服务器,之间是由一个socket 长连接来通信,客户端有一个接收线程在while(true){..}循环里不停地从InputStream流中读数据,客户机每隔几秒钟发一次心跳包至服务端,如果连续未收到心跳包响应的次数已达到规定的次数,客户机认为此链路异常,将socket关闭,那么服务器会抛出java.net.SocketException: Connection reset by peer异常,然后分配给此socket连接的线程退出,那么客户端在while(true){..}循环,读取流时便会发java.net.SocketException:Software caused connection abort: recv failed异常。
已知会导致这种异常的一个场景如下:
客户端和服务端建立tcp的短连接,每次客户端发送一次请求,
服务端响应后关闭与客户端的连接.
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应.
这个时候就会出错.

这个时候客户端Socket的getOutputStream返回来的OutPutStream维护
的是本地的连接状态,
无法知道远程的服务端已经关闭了对应的InputStream和socket因此
虽然调用了
out.write(sendbuf, 0, sendbuf.length);
方法,但是实际上服务端并没有接收到客户端的请求信息.
因为没有抛出异常,因此造成了误以为客户端请求发送成功的假象.

接下来调用etInputStream的in.read(header, 0, 14);方法.
因为这次要读取服务端的信息,因此产生了
Software caused connection abort: recv failed的异常

总结产生原因,在服务端/客户端单方面关闭连接的情况下,另一方依然以为
tcp连接仍然建立,试图读取对方的响应数据,导致出现
Software caused connection abort: recv failed的异常.

因此在receive数据之前,要先判断连接状态.
通过inputstream的available()方法来判断,是否有响应结果.
如果available()的返回值为0,说明没有响应数据,可能是对方已经断开连接,
如果available()的返回值大于0,说明有响应数据.
另外值得注意的是available()返回的值是非堵塞的,可以被多个线程访问

在对方释放连接后,也要释放本地的连接.
追问
这个我试过了 没效果
百度网友96af3d5
2018-04-28 · 超过17用户采纳过TA的回答
知道答主
回答量:75
采纳率:45%
帮助的人:25.5万
展开全部
恢复出厂设置!
更多追问追答
追问
我是做开发的  兄弟  我要改软件,
追答
哦哦,那你就要看看你的线程了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
疯子Vboss
2018-04-28
知道答主
回答量:16
采纳率:100%
帮助的人:7.7万
展开全部
线程是不是被杀死了
更多追问追答
追问
线程还在的   软件会一直打印异常connection refuse,    这时候就算用TCP调试工具也没用了 必须重启才行  纠结
追答
我说的是你数据传输的线程,是不是被杀死了,你看下你的代码是怎么写的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式