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/
谢谢您的赞助,我会做的更好!
相关推荐
"java.net.SocketException Connection reset 解决方法" 在 Java 编程中,SocketException 是一种常见的异常,特别是在网络编程中。Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器...
我使用的是httpClient 进行内部转发 我们在A的服务器上,将前台的文件流,通过httpClient传输到B的服务器上(B的服务器通过控制层接受A传输的文件流,让后保存在B的服务器上。返回一个json结果)
本文将深入探讨如何使用HttpClient来彻底解决乱码问题。 HttpClient是一个功能强大的HTTP客户端,支持多种HTTP协议版本,包括GET、POST等请求方法,以及重试、连接管理等功能。在处理中文字符时,由于编码不一致...
4. 自定义解码:如果以上方式无法解决问题,可以自定义解码逻辑,如使用`InputStreamReader`和`BufferedReader`手动读取字节流并指定字符集。 四、示例代码 以下是一个简单的使用HttpClient发送GET请求并处理乱码的...
https 的支持单向认证 支持多线程 支持get、post
以下是一些解决HttpClient中文乱码问题的关键知识点: 1. **设置字符编码**:在发送HTTP请求时,我们需要确保请求头中的`Content-Type`字段指定了正确的字符集,如`application/x-www-form-urlencoded; charset=UTF...
- HttpClient threadsafety讨论了HttpClient的线程安全问题。 - HttpClient resource deallocation关注了资源释放的问题。 3. HTTP execution context则是关于HTTP执行上下文的介绍,它为HTTP交互提供了运行时上...
4. **重试和恢复策略**:HttpClient内置了重试和恢复策略,当网络出现问题时,可以自动进行重试,保证请求的可靠性。 5. **异步和同步模式**:HttpClient提供同步和异步两种操作模式,适应不同场景的需求。 提到...
标题提到的"解决HttpClient9.0兼容性jar包"正是针对这个问题。 在Android 9.0之前,HttpClient是Android SDK的一部分,但在Pie版本中,它被标记为废弃,并不再默认包含。谷歌推荐开发者使用Android的...
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....
- HttpClient 资源释放(HttpClient Resource Deallocation):介绍了如何正确关闭HttpClient实例以释放资源。 3. HTTP 执行上下文(HTTP Execution Context) - 异常处理(Exception Handling):涵盖了...
服务器端自己写,本示例为客户端代码,可以解决httpClient4乱码问题,是替代修改源码的最佳写法。
5. **异常处理**:HttpClientHelper 应该包含了适当的错误处理机制,如捕获网络异常、解析异常等,以确保在出现问题时能够给出适当的反馈。 6. **HTTP请求配置**:可能还提供了设置超时、添加HTTP头、携带Cookie等...
在IT行业中,从一个技术版本迁移到另一个更新的版本往往是一个重要的步骤,尤其是在...通过本文提供的快速迁移指南,程序员可以减少升级过程中的障碍,并利用社区中的资源来加速学习和解决迁移过程中可能遇到的问题。
为了解决这个问题,我们需要配置HttpClient以信任所有证书,即使它们不是由已知的权威机构颁发的。 首先,我们需要创建一个自定义的`X509TrustManager`,它会忽略证书验证。这是一个简单的实现: ```java X509...
在本文中,我们将深入探讨HttpClient的核心概念、使用方法以及如何通过`httpclient.jar`进行实战应用。 首先,HttpClient的主要组件包括: 1. **HttpClient实例**:这是整个HTTP通信的核心,负责管理连接、请求和...
6. **Connection Management**:HttpClient提供了连接池管理,可以复用已建立的连接,提高性能。`PoolingHttpClientConnectionManager`是实现连接池的主要类。 7. **Redirect Handling**:HttpClient可以处理重定向...
- **连接管理**:HttpClient提供了高级的连接管理机制,包括连接池(Connection Pooling)和智能重用,有效解决了HTTP连接的创建和关闭问题,提高了性能。 - **认证与安全**:支持多种身份验证机制,如基本认证、...
五、常见问题与解决方案 1. 连接超时:可以调整HttpConnectionManager的超时参数,避免请求等待过长。 2. 空闲连接回收:设置合理的KeepAlive策略,防止内存泄露。 3. SSL证书问题:处理自签名或不受信任的证书,...
因此,对`HttpClient`进行重新封装是非常常见的实践,以解决这些问题并增加额外的功能。 重新封装的`HttpClient`类可能包含以下特性: 1. **连接池管理**:默认情况下,`HttpClient`实例不会自动关闭,可能导致...