java.net.SocketException:spring Rest模板中的连接重置

Posted

技术标签:

【中文标题】java.net.SocketException:spring Rest模板中的连接重置【英文标题】:java.net.SocketException: Connection reset in spring Rest template 【发布时间】:2020-03-31 01:24:44 【问题描述】:

我这里有个奇怪的问题。

在我在客户端重新启动 tomcat 服务器之前,以下代码工作正常。一旦我使用相同代码的最新war文件重新启动tomcat服务器(客户端程序在war文件中),它就会引发以下错误。 我正在使用 JDK 8。

以下是示例代码。从浏览器中,我可以从以下程序中使用的 URL 获得响应。但也无法使用 java 程序或 Postman 获取数据。

package com.example.demo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class TestService implements CommandLineRunner 

    @Override
    public void run(String... args) throws Exception 
        download();
    
    
    private void download() 
        System.out.println("Started download");
        try 
            RestTemplate restTemplate = new RestTemplate();
            String url = "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/niftyStockWatch.json";
            byte[] forObject = restTemplate.getForObject(url, byte [].class);
            System.out.println(forObject);
            System.out.println("Downloaded");
         catch (Exception e) 
            System.out.println("Exception " + e);
        
    

这是引发的异常:

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://www.nseindia.com/live_market/dynaContent/live_watch/stock_watch/niftyStockWatch.json": Connection reset; nested exception is java.net.SocketException: Connection reset
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:751)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:677)
    at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:345)
    at com.sudhasoft.service.impl.StocksServiceImpl.getNiftyData(StocksServiceImpl.java:183)
    at com.sudhasoft.service.impl.StocksServiceImpl.getNifty500Data(StocksServiceImpl.java:154)
    at com.sudhasoft.service.impl.PatternServiceImpl.getDataBySignal(PatternServiceImpl.java:444)
    at com.sudhasoft.service.impl.PatternServiceImpl.loadDataOnInit(PatternServiceImpl.java:1090)
    at com.sudhasoft.service.CacheServiceImpl.initCache(CacheServiceImpl.java:29)
    at com.sudhasoft.scheduler.job.CacheJob.clearCache(CacheJob.java:41)
    at com.sudhasoft.scheduler.job.CacheJob.executeJob(CacheJob.java:25)
    at com.sudhasoft.scheduler.StockScheduler$1.run(StockScheduler.java:120)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.security.ssl.InputRecord.readFully(Unknown Source)
    at sun.security.ssl.InputRecord.read(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
    at sun.security.ssl.AppInputStream.read(Unknown Source)
    at okio.Okio$2.read(Okio.java:139)
    at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:345)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:217)
    at okhttp3.internal.http1.Http1Codec.readHeaderLine(Http1Codec.java:212)
    at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)
    at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:88)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:125)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
    at okhttp3.RealCall.execute(RealCall.java:77)
    at org.springframework.http.client.OkHttp3ClientHttpRequest.executeInternal(OkHttp3ClientHttpRequest.java:73)
    at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
    at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:742)
    ... 10 common frames omitted

【问题讨论】:

如果我们可以忽略此问题仅在重新启动服务器(或客户端?)后发生,这将是 ***.com/questions/5507878/ssl-connection-reset 或类似 ***.com/questions/37005352/… 的副本,即。 e.客户端和服务器使用不兼容的 SSL 设置... 看起来您的实际代码与此处提供的示例代码不同。不查看实际代码,不可能找到根本原因。 您是否尝试跳过 SSL 验证 能否请您发布您的 POM.XML 文件 【参考方案1】:

最简单的答案是,当您重新启动 tomcat 时,您只需关闭套接字,然后尝试向关闭的套接字发送更多数据。 这就是为什么你会得到 IO 异常,因为你不能写数据

【讨论】:

【参考方案2】:

这似乎是由于防火墙问题

为了解决这个问题,您需要使用代理服务器。 您可以使用以下 2 行代码添加代理服务器和端口:

System.setProperty("proxyHost", "proxyServer.proxy.com");
System.setProperty("proxyPort", "9801");

【讨论】:

【参考方案3】:

这看起来像是代理相关的错误。

您需要提供代理信息才能通过该 URL 进行连接。

它可以在浏览器中工作,因为那里可能已经配置了 Internet 代理,需要在代码级别显式提供它才能通过 Internet 连接。

Postman 也是如此。您必须在 Postman 配置下提供代理服务器信息。

【讨论】:

以上是关于java.net.SocketException:spring Rest模板中的连接重置的主要内容,如果未能解决你的问题,请参考以下文章

是啥导致我的 java.net.SocketException:连接重置? [复制]

如何修复 java.net.SocketException:损坏的管道?

Java 1.6 HttpsURLConnection:java.net.SocketException:连接重置

java.net.SocketException:recvfrom 失败:ETIMEDOUT(连接超时)

java.net.SocketException:软件导致连接中止:recv 失败 [重复]

如何解决 java.net.SocketException:使用 selenium 的 java 中的连接重置异常?