当前位置: 首页 > news >正文

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”); (我是通过这种方式,加了一行代码解决的)

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

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 {@Overridepublic void checkClientTrusted(X509Certificate[] arg0, String arg1)throws CertificateException {// TODO Auto-generated method stub}@Overridepublic void checkServerTrusted(X509Certificate[] arg0, String arg1)throws CertificateException {// TODO Auto-generated method stub}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}}

调用方式如下:

  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();
http://www.lryc.cn/news/519952.html

相关文章:

  • Maven 仓库的分类
  • 隧道网络:为数据传输开辟安全通道
  • CentOS 7 下 Nginx 的详细安装与配置
  • JAVA 使用apache poi实现EXCEL文件的输出;apache poi实现标题行的第一个字符为红色;EXCEL设置某几个字符为别的颜色
  • 通过vba实现在PPT中添加计时器功能
  • 检验统计量与p值笔记
  • 【集成学习】Bagging、Boosting、Stacking算法详解
  • Rabbit Rocket kafka 怎么实现消息有序消费和延迟消费的
  • 【Ubuntu与Linux操作系统:五、文件与目录管理】
  • 32_Redis分片集群原理
  • 微信小程序mp3音频播放组件,仅需传入url即可
  • Sql 创建用户
  • 数据结构:LinkedList与链表—面试题(三)
  • 【开发日记】Docker修改国内镜像源
  • Elasticsarch:使用全文搜索在 ES|QL 中进行过滤 - 8.17
  • 第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目
  • RK3399开发板Linux实时性改造
  • 青少年编程与数学 02-006 前端开发框架VUE 22课题、状态管理
  • Linux 内核中的 netif_start_queue 函数:启动网络接口发送队列的关键
  • 数据结构之顺序结构二叉树(超详解)
  • acwing_5722_十滴水
  • acwing-3194 最大的矩形
  • UnityDemo-TheBrave-制作笔记
  • 玩转 JMeter:Random Order Controller让测试“乱”出花样
  • VTK知识学习(33)-交互问题2
  • Centos9-SSH免密登录配置-修改22端口-关闭密码登录-提高安全性
  • SqlServer: An expression services limit has been reached异常处理
  • CentOS下安装Docker
  • WPF控件Grid的布局和C1FlexGrid的多选应用
  • Jenkins-持续集成、交付、构建、部署、测试