我的世界connectioninternal :Software caused connection abort:recv failed

同步到微博2016年7月 Oracle大版内专家分月排行榜第二2016年6月 Oracle大版内专家分月排行榜第二
2016年7月 Oracle大版内专家分月排行榜第二2016年6月 Oracle大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Software caused connection abort: recv failed 一种解决 - 天之道,损有余而补不足。人之道,则不然,损不足以奉有余。 - ITeye技术网站
博客分类:
Software caused connection abort: recv failed
java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
产生这个异常的原因有多种方面,单就如 Software caused 所示,
是由于程序编写的问题,而不是网络的问题引起的.
已知会导致这种异常的一个场景如下:
客户端和服务端建立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()返回的值是非堵塞的,可以被多个线程访问
在对方释放连接后,也要释放本地的连接.
浏览 24321
论坛回复 /
(0 / 53910)
浏览: 156662 次
来自: 杭州
还是自己懒惰,期望合并代码讲解
大并发的情况,建议用 ConcurrentHashMap 类
但是这样的话,后面一系列有关性能的联系都没有办法做了啊!
可惜我《深入理解计算机系统》才刚开始看呀!而且我是学java的 ...
BDB  在MySQL数据库中,BDB是一种事务安全型表类型。 ...

参考资料

 

随机推荐