java.net.SocketException:?Connection?reset異常的幾種原因分析和解決方法
導(dǎo)致此異常的原因,總結(jié)下來有三種情況:
一、服務(wù)器端偶爾出現(xiàn)了異常,導(dǎo)致連接關(guān)閉
解決方法: 采用出錯重試機制
二、 服務(wù)器端和客戶端使用的連接方式不一致
解決方法: 服務(wù)器端和客戶端使用相同的連接方式,即同時使用長連接或短連接
三、如果是HTTPS,那么還存在TLS版本不一致
解決方法: 服務(wù)器端和客戶端使用相同的TLS版本,我遇到的就是這種情況。
附錄:JDK中對 HTTPS 版本的支持情況:
JDK 6
SSL v3
TLS v1(默認(rèn))
TLS v1.1(JDK6 update 111 及以上)
JDK 7
SSLv3
TLS v1(默認(rèn))
TLS v1.1
TLS v1.2
JDK 8
SSL v3
TLS v1
TLS v1.1
TLS v1.2(默認(rèn))
方法一:如果客戶端JDK是1.7,服務(wù)器端要求TLSv1.2,那么在啟動參數(shù)加上-Dhttps.protocols=TLSv1.2即可。
方法二:代碼指定TLS版本 System.setProperty(“https.protocols”, “TLSv1.2”); (我是通過這種方式,加了一行代碼解決的)
方法三:可以用以下工具類方法解決:
public class HttpClientFactory {
private static CloseableHttpClient client;
public static HttpClient getHttpsClient() throws Exception {
if (client != null) {
return client;
}
SSLContext sslcontext = SSLContexts.custom().useSSL().build();
sslcontext.init(null, new X509TrustManager[]{new HttpsTrustManager()}, new SecureRandom());
SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext,new String[] { "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" }, null,
SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
client = HttpClients.custom().setSSLSocketFactory(factory).build();
return client;
}
public static void releaseInstance() {
client = null;
}
}
public class HttpsTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
// TODO Auto-generated method stub
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
}
}
調(diào)用方式如下:
HttpClient httpClient = HttpClientFactory.getHttpsClient();
HttpPost request = new HttpPost(requestUrl);
request.setEntity(new StringEntity(gson.toJson(requestMap), "application/json", "UTF-8"));
HttpResponse httpResponse = httpClient.execute(request);
resultStr = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
System.out.println(resultStr);
httpResponse.getEntity().getContent().close();總結(jié)
到此這篇關(guān)于java.net.SocketException: Connection reset異常的幾種原因分析和解決方法的文章就介紹到這了,更多相關(guān)java.net.SocketException: Connection reset異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springKafka生產(chǎn)者、消費者,數(shù)據(jù)發(fā)送/接收方式
這篇文章主要介紹了springKafka生產(chǎn)者、消費者,數(shù)據(jù)發(fā)送/接收方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-09-09
Java中LambdaQueryWrapper的常用方法詳解
這篇文章主要給大家介紹了關(guān)于Java中LambdaQueryWrapper常用方法的相關(guān)資料,lambdaquerywrapper是一個Java庫,用于構(gòu)建類型安全的Lambda表達式查詢,需要的朋友可以參考下2023-11-11
Spring超出最大會話數(shù)(Max?sessions?limit?reached:?10000)
在Spring系統(tǒng)中遇到的Maxsessionslimitreached:10000錯誤,該錯誤由于會話數(shù)超過默認(rèn)限制10000而觸發(fā),下面就來介紹一下解決方法,感興趣的可以了解一下2024-12-12
SpringBoot從yml配置文件中讀常用參數(shù)值實例方法
在本篇文章里小編給大家整理了關(guān)于SpringBoot從yml配置文件中讀常用參數(shù)值實例方法,有需要的朋友們學(xué)習(xí)下。2019-12-12
Springboot+aop實現(xiàn)配置多數(shù)據(jù)源的示例代碼
本文介紹了如何使用SpringAOP和注解實現(xiàn)動態(tài)數(shù)據(jù)源切換,通過自定義注解和ThreadLocal存儲數(shù)據(jù)上下文信息,重寫AbstractRoutingDataSource類并使用自定義切面來實現(xiàn)動態(tài)數(shù)據(jù)源的切換,感興趣的可以了解一下2024-11-11
K8S(Docker)如何優(yōu)雅的關(guān)閉SpringBoot微服務(wù)
這篇文章主要介紹了K8S(Docker)如何優(yōu)雅的關(guān)閉SpringBoot微服務(wù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-01-01

