java.io.IOException: 连接被对方重设 Connection reset
发布日期:2021-06-30 16:22:58 浏览次数:4 分类:技术文章

本文共 1044 字,大约阅读时间需要 3 分钟。

错误日志 

错误原因:

检查服务器JDK版本与本地编译JDK版本是否一致

检查服务器是否有丢包现象

检查服务器中间件超时时间设置

客户端与服务端的连接设置了超时时间,服务端那里的连接时间已经超时,而客户端不知道这个连接已经超时,接着访问,就会出现这个错误。服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,然后此时客户端就会提示java.net.SocketException: Connection reset

TCP建立连接时需要三次握手,在释放连接需要四次挥手;例如三次握手的过程如下:

  1. 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;

  2. 第二次握手:服务器收到syn包,并会确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

  3. 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

可以看到握手时会在客户端和服务器之间传递一些TCP头信息,比如ACK标志、SYN标志以及挥手时的FIN标志等。

除了以上这些常见的标志头信息,还有另外一些标志头信息,比如推标志PSH、复位标志RST等。其中复位标志RST的作用就是“复位相应的TCP连接”。

首先是出错了重试:这种方案可以简单防止“Connection reset”错误,然后如果服务不是“幂等”的则不能使用该方法;比如提交订单操作就不是幂等的,如果使用重试则可能造成重复提单。

然后是客户端和服务器统一使用TCP长连接:客户端使用TCP长连接很容易配置(直接设置HttpClient就好),而服务器配置长连接就比较麻烦了,就拿tomcat来说,需要设置tomcat的maxKeepAliveRequests、connectionTimeout等参数。另外如果使用了nginx进行反向代理或负载均衡,此时也需要配置nginx以支持长连接(nginx默认是对客户端使用长连接,对服务器使用短连接)。

解决方式:在Tomcat中server.xml中配置连接为长连接即可

配置如下:

http1.0 默认短连接,http1.1开始默认长连接

关于tomcat参数:

短连接配置:

 

长连接配置:

 

 

转载地址:https://kevin.blog.csdn.net/article/details/109363238 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ping服务器间歇性丢包的解决方案
下一篇:利用Java程序分析福彩3D

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月05日 13时01分04秒