java.net.SocketException: Connection reset 异常原因分析和解决方法

导致此异常的原因,总结下来有三种情况:

一、服务器端偶尔出现了异常,导致连接关闭
解决方法: 采用出错重试机制

二、 服务器端和客户端使用的连接方式不一致
解决方法: 服务器端和客户端使用相同的连接方式,即同时使用长连接或短连接

三、如果是HTTPS,那么还存在TLS版本不一致
解决方法: 服务器端和客户端使用相同的TLS版本,我遇到的就是这种情况。

附录:JDK中对 HTTPS 版本的支持情况:

JDK 6

SSL v3

TLS v1(默认)

TLS v1.1(JDK6 update 111 及以上)

JDK 7

SSLv3

TLS v1(默认)

TLS v1.1

TLS v1.2

JDK 8

SSL v3

TLS v1

TLS v1.1

TLS v1.2(默认)

方法一:如果客户端JDK是1.7,服务器端要求TLSv1.2,那么在启动参数加上-Dhttps.protocols=TLSv1.2即可。

方法二:代码指定TLS版本 System.setProperty("https.protocols", "TLSv1.2"); (我是通过这种方式,加了一行代码解决的)

方法三:可以用以下工具类方法解决:

javascript 复制代码
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;
    }
}
javascript 复制代码
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[]{};
    }

}

调用方式如下:

javascript 复制代码
  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();
相关推荐
zzywxc7879 分钟前
详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
开发语言·javascript·人工智能·深度学习·金融·prompt·流程图
浮灯Foden21 分钟前
算法-每日一题(DAY13)两数之和
开发语言·数据结构·c++·算法·leetcode·面试·散列表
淡海水35 分钟前
【原理】Struct 和 Class 辨析
开发语言·c++·c#·struct·class
Q_Q196328847540 分钟前
python的电影院座位管理可视化数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
该用户已不存在42 分钟前
OpenJDK、Temurin、GraalVM...到底该装哪个?
java·后端
杜子不疼.1 小时前
《Python学习之第三方库:开启无限可能》
开发语言·python·学习
TT哇1 小时前
@[TOC](计算机是如何⼯作的) JavaEE==网站开发
java·redis·java-ee
Tina学编程1 小时前
48Days-Day19 | ISBN号,kotori和迷宫,矩阵最长递增路径
java·算法
青川入梦1 小时前
MyBatis极速通关上篇:Spring Boot环境搭建+用户管理实战
java·开发语言·mybatis
执子手 吹散苍茫茫烟波2 小时前
leetcode415. 字符串相加
java·leetcode·字符串