okhttp3报错java.net.SocketException: Connection reset连接重置问题

在本地测试服务器之间okhttp3可正常发送请求,到内网正式环境后okhttp3发送请求出现如下报错,请问哪些原因会造成这种情况?


java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at okio.InputStreamSource.read(Okio.kt:102)
    at okio.AsyncTimeout$source$1.read(AsyncTimeout.kt:159)
    at okio.RealBufferedSource.indexOf(RealBufferedSource.kt:349)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.kt:222)
    at okhttp3.internal.http1.Http1ExchangeCodec.readHeaderLine(Http1ExchangeCodec.kt:210)
    at okhttp3.internal.http1.Http1ExchangeCodec.readResponseHeaders(Http1ExchangeCodec.kt:181)
    at okhttp3.internal.connection.Exchange.readResponseHeaders(Exchange.kt:105)
    at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.kt:82)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:37)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:184)
    at okhttp3.RealCall.execute(RealCall.kt:66)
    at com.stardon.sync.common.HttpClient.uploadFile(HttpClient.java:265)
    at com.stardon.sync.common.HttpClient.uploadFile(HttpClient.java:198)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1384)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at com.stardon.sync.acd_risk.RiskEvent.getRiskRoadDto(RiskEvent.java:165)
    at com.stardon.sync.acd_risk.RiskEvent.newRiskRoad(RiskEvent.java:75)
    at com.stardon.sync.controller.RiskRoadController.add(RiskRoadController.java:129)
    at com.stardon.sync.controller.RiskRoadController$$FastClassBySpringCGLIB$$a9ae7b14.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:294)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.stardon.sync.controller.RiskRoadController$$EnhancerBySpringCGLIB$$dbbbbf0a.add(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:117)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

"java.net.SocketException: Connection reset" 错误通常在客户端仍在尝试发送或接收数据时,与服务器的连接突然关闭时发生。可能出现这种情况的原因有几种:

  1. 网络连接问题:连接可能因网络问题而丢失,如连接中断、防火墙阻止连接或网络配置错误等。

  2. 服务器端问题:服务器可能超载或出现问题,导致它过早地终止连接。

  3. 客户端问题:客户端可能在服务器完成发送数据之前超时或关闭连接。

  4. SSL/TLS 配置不正确:如果您使用 SSL/TLS 加密连接,则错误可能是由于错误配置的 SSL/TLS 设置引起的。

为了诊断问题,您可以尝试以下操作:

  1. 检查服务器日志,查看是否有任何与问题相关的错误或警告。

  2. 检查客户端日志,查看是否有任何与问题相关的错误或警告。

  3. 检查客户端和服务器之间的网络连接,确保没有问题。

  4. 如果您使用 SSL/TLS,请确保其已正确配置,并且证书有效。

  5. 尝试增加客户端的超时值,以查看是否解决了问题。

  6. 尝试使用其他客户端库或工具运行相同的请求,以查看问题是否仍然存在。

  7. 如果所有其他方法都无法解决问题,您可能需要联系服务器管理员或您正在使用的客户端库的支持团队,以帮助您诊断问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇文章:java.net.SocketException: Connection reset卡了我三天,总算解决了 也许能够解决你的问题,你可以看下
  • 除此之外, 这篇博客: java.net.SocketException: Connection reset 码匠笔记的论坛实战项目,使用access_token获取用户的异常处理。中的 关于 okhttp 的 java.net.SocketException: Connection reset异常 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    使用OkHttp过程出现java.net.SocketException: Connection reset 异常。我个人觉得okhttp时好时坏,使用它的api有时候能够登录GitHub成功,有时候一直登录失败,报此Connection reset 异常。具体原因我也不清楚,这个网络上有相关文章。但是GitHub应该做了相关的处理,如果你在一段时间内频繁访问它的api网站,它会给你拒绝连接,就好比抵制恶意攻击,我换用这个HttpClient后,至少比原来的okhttp方式好一些,十次能有8次成功。所以最好的方式就是换掉它。

  • 以下回答来自chatgpt:

    根据参考资料以及问题描述,出现连接重置的问题很可能是网络原因导致的,可以尝试增加连接超时、读写超时和池化连接等的参数配置来解决该问题。具体的解决方法如下:

    1. 修改OkHttpUtils类中的连接超时、读写超时和池化连接等配置参数,如下所示:
    public class OkHttpUtils {
    
        private final static int READ_TIMEOUT = 60; // 修改为60秒
    
        private final static int CONNECT_TIMEOUT = 60; // 修改为60秒
    
        private final static int WRITE_TIMEOUT = 60; // 修改为60秒
    
        private static volatile OkHttpClient okHttpClient;
    
        private OkHttpUtils() {
            OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
            // 读取超时
            clientBuilder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
            // 连接超时
            clientBuilder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);
            // 写入超时
            clientBuilder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS);
            // 自定义连接池最大空闲连接数和等待时间大小,否则默认最大5个空闲连接
            clientBuilder.connectionPool(new ConnectionPool(32, 5, TimeUnit.MINUTES));
    
            okHttpClient = clientBuilder.build();
        }
    
        public static OkHttpClient getInstance() {
            if (null == okHttpClient) {
                synchronized (OkHttpUtils.class) {
                    if (okHttpClient == null) {
                        new OkHttpUtils();
                        return okHttpClient;
                    }
                }
            }
            return okHttpClient;
        }
    }
    
    1. 调整线程池中核心线程数量和最大线程数量等参数。如果下载任务较多,需要保证足够数量的OkHttp连接,可以适当增加连接池最大空闲数量,例如修改为32:
    ExecutorService executorService = new ThreadPoolExecutor(
            10, // 核心线程数量
            24, // 最大线程数量
            0, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(),
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy()
    );
    
    1. 如果还未解决问题,可以考虑加入TRY-CATCH-REDO-FINALLY逻辑来保证业务安全,如下载失败则重新下载或记录日志等等。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^