一次java.net.SocketException: Connection reset引发的惨案

	最近公司的项目介入了一个的三方支付,因为刚来公司不久,正好接手了这一块,在接入三方支付api时候发现在本地代码在编辑器跑测试没问题,但是上传到测试服务器后无法进行调用三方api报错socket异常如下
java.net.SocketException: Connection reset
 at java.net.SocketInputStream.read(SocketInputStream.java:196)
 at java.net.SocketInputStream.read(SocketInputStream.java:122)
 at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
 at sun.security.ssl.InputRecord.read(InputRecord.java:480)
 at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
 at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
 at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
 at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
 at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
 at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
 at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)```
	开始以为是代码 问题 检查代码 后无异常跟测试环境代码完全相同 ,开始怀疑是否是nginx 或者 是服务器 的问题,	因为服务器是我新申请的,各种环境也是我新搭建的。	所以首先排查是否服务器问题,直接在linux上curl了一下请求三方下单接口发现没有问题可以跑得通 ,所以服务器问题排掉, 后检查nginx 也没的问题, 所以怀疑是否是jdk 环境问题,所以将项目单独部署本地tomcat进行测试, 将本地环境更换为1.7 进行测试 发现使用jdk.net http 调用三方api 进行连接 出现跟测试服务器相同异常 无法建立连接, 所以又将本地jdk 更换为1.8 之后调用api正常, 此时问题定位 应该是jdk版本问题, 所以去查官方文档发现jdk1.7 TLS协议 默认是 1.1 但是三方支付api  应该使用TLS1.2**还有一点就是 为什么之前本地 跑是没问题,因为本人一直是在本地idea编辑器进行测试 编辑器项目 用的1.8 所以一直没发现这个问题。**
*总之就是一个TLS协议版本的	问题*

解决办法:
代码中添加 协议版本
```java
SSLContext sslcontext = SSLContext.getInstance("TLSv1.2");

官方文档连接

问题总结:
1. 对jdk各个版本之间差异理解不透
2. 问题扩大化。
3. 信心不够 总觉得自己搭建服务有问题
4. 还是学艺不精啊 …

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值