`
knight_black_bob
  • 浏览: 841811 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

httpclient 解决 connection reset 问题

阅读更多

 

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/



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

0
0
分享到:
评论

相关推荐

    java.net.SocketException Connection reset 解决方法

    "java.net.SocketException Connection reset 解决方法" 在 Java 编程中,SocketException 是一种常见的异常,特别是在网络编程中。Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器...

    使用httpclient解决跨域问题

    我使用的是httpClient 进行内部转发 我们在A的服务器上,将前台的文件流,通过httpClient传输到B的服务器上(B的服务器通过控制层接受A传输的文件流,让后保存在B的服务器上。返回一个json结果)

    彻底解决httpClient乱码问题

    本文将深入探讨如何使用HttpClient来彻底解决乱码问题。 HttpClient是一个功能强大的HTTP客户端,支持多种HTTP协议版本,包括GET、POST等请求方法,以及重试、连接管理等功能。在处理中文字符时,由于编码不一致...

    HttpClient、乱码解决:实例

    4. 自定义解码:如果以上方式无法解决问题,可以自定义解码逻辑,如使用`InputStreamReader`和`BufferedReader`手动读取字节流并指定字符集。 四、示例代码 以下是一个简单的使用HttpClient发送GET请求并处理乱码的...

    httpClient 解决 https

    https 的支持单向认证 支持多线程 支持get、post

    解决HttpClient中文乱码问题jar文件

    以下是一些解决HttpClient中文乱码问题的关键知识点: 1. **设置字符编码**:在发送HTTP请求时,我们需要确保请求头中的`Content-Type`字段指定了正确的字符集,如`application/x-www-form-urlencoded; charset=UTF...

    httpclient

    - HttpClient threadsafety讨论了HttpClient的线程安全问题。 - HttpClient resource deallocation关注了资源释放的问题。 3. HTTP execution context则是关于HTTP执行上下文的介绍,它为HTTP交互提供了运行时上...

    httpclient.jar包下载

    4. **重试和恢复策略**:HttpClient内置了重试和恢复策略,当网络出现问题时,可以自动进行重试,保证请求的可靠性。 5. **异步和同步模式**:HttpClient提供同步和异步两种操作模式,适应不同场景的需求。 提到...

    解决HttpClient9.0兼容性jar包

    标题提到的"解决HttpClient9.0兼容性jar包"正是针对这个问题。 在Android 9.0之前,HttpClient是Android SDK的一部分,但在Pie版本中,它被标记为废弃,并不再默认包含。谷歌推荐开发者使用Android的...

    httpclient-4.5jar

    httpclient-4.5所需jar包,里面包含httpclient-4.5.jar等等10个必须的开发包。 1.commons-codec-1.9.jar 2.commons-logging-1.2.jar 3.fluent-hc-4.5.jar 4.httpclient-4.5.jar 5.httpclient-cache-4.5.jar 6....

    HttpClientHelper 工具类

    5. **异常处理**:HttpClientHelper 应该包含了适当的错误处理机制,如捕获网络异常、解析异常等,以确保在出现问题时能够给出适当的反馈。 6. **HTTP请求配置**:可能还提供了设置超时、添加HTTP头、携带Cookie等...

    httpclient4上传文件中文乱码问题解决办法代码示例

    服务器端自己写,本示例为客户端代码,可以解决httpClient4乱码问题,是替代修改源码的最佳写法。

    HttpClient 3.x to HttpComponents HttpClient 4.x

    在IT行业中,从一个技术版本迁移到另一个更新的版本往往是一个重要的步骤,尤其是在...通过本文提供的快速迁移指南,程序员可以减少升级过程中的障碍,并利用社区中的资源来加速学习和解决迁移过程中可能遇到的问题。

    httpclient ssl 相关问题解决资料

    为了解决这个问题,我们需要配置HttpClient以信任所有证书,即使它们不是由已知的权威机构颁发的。 首先,我们需要创建一个自定义的`X509TrustManager`,它会忽略证书验证。这是一个简单的实现: ```java X509...

    httpclient httpclient.jar

    在本文中,我们将深入探讨HttpClient的核心概念、使用方法以及如何通过`httpclient.jar`进行实战应用。 首先,HttpClient的主要组件包括: 1. **HttpClient实例**:这是整个HTTP通信的核心,负责管理连接、请求和...

    HttpClient-4.3.6

    - **连接管理**:HttpClient提供了高级的连接管理机制,包括连接池(Connection Pooling)和智能重用,有效解决了HTTP连接的创建和关闭问题,提高了性能。 - **认证与安全**:支持多种身份验证机制,如基本认证、...

    HttpClient重新封装的HttpClient类

    因此,对`HttpClient`进行重新封装是非常常见的实践,以解决这些问题并增加额外的功能。 重新封装的`HttpClient`类可能包含以下特性: 1. **连接池管理**:默认情况下,`HttpClient`实例不会自动关闭,可能导致...

    Android 9.0 httpclient问题

    Android 9.0 httpclient导致崩溃,找不到httpclient相关类,将包放入lib下即可

Global site tag (gtag.js) - Google Analytics