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(连接超时)