httpclient 解决 connection reset 问题

简介:   httpclient 解决 connection reset 问题   错误如下:   java.net.SocketException: Connection reset at java.

 

httpclient 解决 connection reset 问题

 

错误如下:

 

java.net.SocketException: Connection reset
       at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:118)
       at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
       atorg.apache.http.impl.io.SessionOutputBufferImpl.streamWrite(SessionOutputBufferImpl.java:124)
       atorg.apache.http.impl.io.SessionOutputBufferImpl.flushBuffer(SessionOutputBufferImpl.java:136)
       atorg.apache.http.impl.io.SessionOutputBufferImpl.write(SessionOutputBufferImpl.java:167)
       at org.apache.http.impl.io.ContentLengthOutputStream.write(ContentLengthOutputStream.java:113)
       atorg.apache.http.entity.mime.content.FileBody.writeTo(FileBody.java:121)
       atorg.apache.http.entity.mime.AbstractMultipartForm.doWriteTo(AbstractMultipartForm.java:134)
       at org.apache.http.entity.mime.AbstractMultipartForm.writeTo(AbstractMultipartForm.java:157)
       atorg.apache.http.entity.mime.MultipartFormEntity.writeTo(MultipartFormEntity.java:113)
       at org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(DefaultBHttpClientConnection.java:156)
       atorg.apache.http.impl.conn.CPoolProxy.sendRequestEntity(CPoolProxy.java:162)
       atorg.apache.http.protocol.HttpRequestExecutor.doSendRequest(HttpRequestExecutor.java:238)
       at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
       atorg.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:271)
       atorg.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:184)
       atorg.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:88)
       atorg.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
       atorg.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
       atorg.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
       atorg.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:107)

 

 

解决方法:

1.  使用TCP短链接无效

 httppost.setProtocolVersion(HttpVersion.HTTP_1_0);
 httppost.addHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);

 2.设置超时时间

int timeout = 60;
RequestConfig defaultRequestConfig = RequestConfig.custom()
	.setSocketTimeout(timeout * 1000)
	.setConnectTimeout(timeout * 1000)
	.setConnectionRequestTimeout(timeout * 1000)
	.build();

3.使用 CloseableHttpResponse  

 CloseableHttpResponse response = null;  
 response = httpClient.execute(httpPost);
 HttpEntity httpEntity = response.getEntity();
 EntityUtils.consume(httpEntity);        //按照官方文档的说法:二者都释放了才可以正常的释放链接
 response.close();

 

 

具体代码如下:

 

package com.curiousby.cn.srpignbootdemo.util;

import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

 
public class HttpHelper {


	private final static Logger logger = Logger.getLogger(HttpHelper.class); 

    public static final String CHARSET = "UTF-8";

    private static CloseableHttpClient httpClient = createSSLInsecureClient(); 

    public static final Integer HTTP_OK = 200;

    public static final String CONTENT_TYPE_NAME = "Content-Type";

    public static final String CONTENT_TYPE_JSON = "application/json;charset=UTF-8";

    public static final String CONTENT_TYPE_XML = "text/xml;charset=UTF-8";

    public static final String CONTENT_TYPE_FORM = "application/x-www-form-urlencoded;charset=UTF-8";

    public static final String ACCEPT_NAME = "Accept";
    public static final String ACCEPT = "application/json;charset=UTF-8";
    
    public static final  int TIMEOUT = 60;//这个要弄长点

  
    
    public static String postUrl(String url, Map<String, Object> params) { 
    	 String result = null;
         CloseableHttpResponse response = null;       //返回结果,释放链接
         List<NameValuePair> pairs = new ArrayList<NameValuePair>();
         try {
             if (params != null && !params.isEmpty()) {
                 for (Map.Entry<String, Object> entry : params.entrySet()) {
                     String value = Validator.get_obj_or_empty(entry.getValue()).toString();
                     if (value != null) {
                         pairs.add(new BasicNameValuePair(entry.getKey(), value));
                     }
                 }
             }
           
             RequestConfig defaultRequestConfig = RequestConfig.custom()
                     .setSocketTimeout(TIMEOUT * 1000)
                     .setConnectTimeout(TIMEOUT * 1000)
                     .setConnectionRequestTimeout(TIMEOUT * 1000)
                     .build();
             
             HttpPost httpPost = new HttpPost(url);
             httpPost.setProtocolVersion(HttpVersion.HTTP_1_0);
             httpPost.addHeader(CONTENT_TYPE_NAME, CONTENT_TYPE_FORM);
             httpPost.addHeader(ACCEPT_NAME, ACCEPT);
             httpPost.addHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
             httpPost.setConfig(defaultRequestConfig);
             
             httpPost.setEntity(new UrlEncodedFormEntity(pairs, CHARSET));
             response = httpClient.execute(httpPost);     //建立链接得到返回结果
             int statusCode = response.getStatusLine().getStatusCode();      //返回的结果码
             if (statusCode != 200) {
                 httpPost.abort(); 
                 logger.error("===httphelper==httpclient===请求异常");
                 return null;
             }
             HttpEntity httpEntity = response.getEntity();
             if (httpEntity == null) { 
            	 logger.error("===httphelper==httpclient===返回结果异常");
                 return null;
             } else {
                 result = EntityUtils.toString(httpEntity, CHARSET);
             }
             EntityUtils.consume(httpEntity);        //按照官方文档的说法:二者都释放了才可以正常的释放链接
             response.close();
             return result;
         } catch (Exception e) {
        	  logger.error("===httphelper==httpclient===请求错误"+e.getMessage()+",错误信息"+e);
        	  return null;
         } finally {
             if (response != null) {
                 try {
                     response.close();
                 } catch (IOException e) {
                	 logger.error("===httphelper==httpclient===关闭流异常"+e.getMessage()+",错误信息"+e);
                 }
             }
         }
    }
    
    
    public static CloseableHttpClient createSSLInsecureClient() {
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null,
                    new TrustStrategy() {

                        public boolean isTrusted(X509Certificate[] chain, String authType)
                                throws CertificateException {
                            return true;
                        }
                    }).build();
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
                    SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            return HttpClients.custom().setMaxConnTotal(100).setMaxConnPerRoute(10)
                    .setSSLSocketFactory(sslsf).build();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        }
        return HttpClients.createDefault();
    }
  

}
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者 

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。

 

个人主页http://knight-black-bob.iteye.com/



 
 
 谢谢您的赞助,我会做的更好!

目录
相关文章
|
域名解析 网络协议 安全
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
在Linux中,想在命令行下访问某个网站,并且该网站域名还没有解析,如何做?
|
安全 算法 Java
Java“SSLException”错误解决
Java“SSLException”错误通常发生在SSL/TLS连接过程中,可能是由于证书问题、握手失败或加密套件不匹配等原因引起。解决方法包括检查服务器证书、配置信任库、确保JDK版本兼容等。
3343 4
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
14667 33
MCP客户端调用看这一篇就够了(Java版)
|
Java 网络安全
解析connectionReset异常的原因与解决方案
解析connectionReset异常的原因与解决方案
7313 0
|
Prometheus 监控 Cloud Native
Grafana 最全详解 ( 图文全面总结 )
Grafana是非常重要的微服务部署监控工具,被广泛应用于大型网站架构,本文全面详解。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Grafana 最全详解  ( 图文全面总结 )
|
SQL Java 数据库
微服务技术系列教程(39)- SpringBoot -RBAC权限模型
微服务技术系列教程(39)- SpringBoot -RBAC权限模型
772 0
|
人工智能 IDE 开发工具
给IntelliJ IDEA添加AI功能
这篇文章讲解了如何在IntelliJ IDEA中安装和使用阿里云开发的通义灵码插件,以增强IDE的人工智能辅助编程功能。
11606 0
给IntelliJ IDEA添加AI功能
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
Java
Java aop 如何获取方法的参数体
【8月更文挑战第12天】Java aop 如何获取方法的参数体
838 2
|
Java 网络安全 API
Java中如何解决SocketException异常?
Java中如何解决SocketException异常?
1324 2