本文共 1044 字,大约阅读时间需要 3 分钟。
错误日志
错误原因:
检查服务器JDK版本与本地编译JDK版本是否一致
检查服务器是否有丢包现象
检查服务器中间件超时时间设置
客户端与服务端的连接设置了超时时间,服务端那里的连接时间已经超时,而客户端不知道这个连接已经超时,接着访问,就会出现这个错误。服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,然后此时客户端就会提示java.net.SocketException: Connection reset
TCP建立连接时需要三次握手,在释放连接需要四次挥手;例如三次握手的过程如下:
-
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;
-
第二次握手:服务器收到syn包,并会确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
-
第三次握手:客户端收到服务器的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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!