本文转截自:http://www.thinkingquest.net/articles/210.html
3.x版本的httpclient属于apache的commons项目。 从4.x开始,httpclient被转移到了httpcomponent项目下。 api也发生了重大的变化。 http 3.x已经不推荐使用。使用3.x版本的地方,官方建议都升级到4.x版本。
本文的api也都基于4.x版本。下面是一个最simple的案例:
private String upload(String url, HttpEntity entity) { String result = null; HttpClient httpClient = new DefaultHttpClient(); try { HttpPost httpPost = new HttpPost(url); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost); int status = response.getStatusLine().getStatusCode(); if (status == HttpStatus.SC_OK) { HttpEntity resEntity = response.getEntity(); result = EntityUtils.toString(resEntity, "UTF-8"); } else { logger.error("upload:" + url + " error code:" + status); } } catch (Exception ex) { logger.error("Error with HttpClient ", ex); } finally { try { httpClient.getConnectionManager().shutdown(); } catch (Exception ignore) {} } return result; }
在这段代码中,每调用一次upload方法,都会new一次 BasicHttpClient对象。由此产生一个疑问,这个对象是否是线程安全的呢?查阅了文档,文档中说它是线程安全的。文档地 址:http://hc.apache.org/httpcomponents-client-ga/tutorial/html /httpagent.html
实测对一个BasicHttpClient对象,多个线程调用,只有一个线程运行正常,其他线程全部抛出异常。究其根源,是其中的ConnectionManager的问题。
在多线程的情况下,如果创建一个BasicHttpClient对象,代码应该如下:
PoolingClientConnectionManager cm = new PoolingClientConnectionManager(); cm.setMaxTotal(200); cm.setDefaultMaxPerRoute(20); BasicHttpParams params = new BasicHttpParams(); params.setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true); params.setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 64 * 1024); client = new DefaultHttpClient(cm, params);
每次执行client.execute(method)之后,需要调用method的releaseConnection()方法。
PoolingClientConnectionManager是其中的关键,替代了默认采用的BasicClientConnectionManager。这样就可以多线程。
setMaxTotal设置的是最大连接数。如果不设置,默认值为20。defaultMaxPerRoute的默认值是2。文档中说,这两个参数过于保守。对于频繁请求的应用来说,都太小了。
关于其它的参数可以参见文档:
http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d5e399
本文转截自:http://www.thinkingquest.net/articles/210.html
----
PS:
可以使用method的abort方法 哎~~
相关推荐
总结,HttpClient作为一款强大的多线程框架,其在Android环境下的应用主要体现在高效的数据加载和下载。通过合理的多线程管理,HttpClient能够显著提升网络操作的性能,同时提供丰富的定制化选项。尽管在新的Android...
本篇文章将深入探讨如何使用HTTPClient进行多线程分段下载的实践。 首先,我们要理解多线程下载的基本原理。多线程下载是通过将大文件分割成多个小段,每个线程负责下载一个或多个段,这样可以充分利用多核处理器的...
标题中的“用HttpClient写了一个多线程下载软件”意味着我们将探讨如何使用Apache HttpClient库来创建一个支持多线程的文件下载应用。HttpClient是一个强大的Java库,它提供了丰富的HTTP客户端功能,包括请求发起、...
在多线程环境下,HttpClient可以有效地处理并发请求,提高应用程序的性能。 在Spring框架中整合HttpClient,通常会创建一个自定义的HttpClinet工具类,如`HttpClientUtil.java`所示。这个工具类可能包含静态方法,...
本文将详细讲解如何使用HTTPClient进行POST请求,并探讨在多线程环境下的应用,以及与"Grabticket"这个场景相关的实践。 HTTPClient是由Apache基金会开发的一个开源库,它提供了强大的功能来执行HTTP请求,包括GET...
4、多线程下载:使用RandomAccessFile输出流写 5、多线程下载-断点续传:使用临时文件记录当前下载的数据,下次读取文件开始下载 6、下载显示进度条-ProgressBar 7、在gitbub上面下载已经有支持断点续传功能的代码...
通过使用HttpClient的连接池和多线程,我们可以有效地并发执行HTTP GET请求,同时控制并发数量,避免过多的网络连接导致服务器压力过大。这种方式提高了请求效率,减少了资源消耗,并且遵循了最佳实践。
这就是使用Apache HttpClient实现多线程下载的基本步骤。通过这种方式,我们可以有效地利用网络带宽,提高大文件下载的速度。同时,注意在实际应用中,还需要考虑错误处理、断点续传、下载进度显示等功能,以提升...
- **1.2.1 HttpClient线程安全性**: `HttpClient`实例本身不是线程安全的,但在正确配置下,可以支持多线程并发访问。 - **1.2.2 HttpClient资源释放**: 使用完`HttpClient`后,应该调用其提供的方法来释放资源,...
HttpClient还支持重试机制、连接池管理、多线程请求等高级特性,使得在处理大量HTTP请求时更加高效和稳定。此外,HttpClient可以与其他Apache Commons库,如HttpCore、HttpComponents等配合使用,实现更复杂的网络...
在C# Winform应用中实现多线程下载是一项常见的任务,尤其在处理大文件或需要提高下载速度的情况下。本文将详细讲解如何利用C#的多线程技术来创建一个Winform应用程序,实现高效的文件下载功能。 首先,我们需要...
在IT行业中,多线程是提高程序性能和利用系统资源的有效手段,特别是在处理I/O密集型任务如文件下载时。C#作为一种强大的编程语言,提供了丰富的多线程支持,使得开发者能够轻松地创建并管理多个执行线程。本文将...
同时,需要注意HttpClient不是线程安全的,因此在多线程环境中,每个线程应有自己的HttpClient实例。 6. **处理重定向**: HttpClient默认会自动处理重定向,但你可以通过配置`RedirectStrategy`来改变这一行为。 ...
默认实现`SingleClientConnManager`适用于单线程或短连接的应用,而`MultiThreadedHttpConnectionManager`则适合多线程和长时间运行的程序,它可以维护一个连接池,提高性能。 2. **请求构造**:你可以使用`...
- HttpClient 线程安全(HttpClient Thread Safety):讨论了如何在多线程环境中安全使用HttpClient实例。 - HttpClient 资源释放(HttpClient Resource Deallocation):介绍了如何正确关闭HttpClient实例以释放...
5. **异步请求**:虽然HttpClient 3.0主要设计为同步模型,但通过多线程和回调机制,可以实现一定程度的异步处理。 四、示例代码 ```java import org.apache.commons.httpclient.HttpClient; import org.apache....
多线程访问网页的部分,通常会使用到HttpClient或者WebClient类。HttpClient是.NET Framework 4.5及更高版本中推荐的HTTP客户端通信工具,它支持异步操作,非常适合多线程环境。程序可能会为每个数字创建一个新的...
本篇将详细讲解如何使用`HttpClient`进行异步请求数据,并结合Android的`AsyncTask`来处理后台任务,避免阻塞UI线程。 首先,理解`HttpClient`的基本使用方法。`HttpClient`包含几个关键组件,如`HttpClient`实例、...
8. **多线程请求执行**:HttpClient支持在多线程环境中执行请求,这使得在并发环境中使用HttpClient更加安全。 9. **HTTP状态管理**:HttpClient支持HTTP cookie的管理,包括不同版本的cookie处理、cookie策略选择...
1. **多线程支持**:HttpClient 4.2.1支持多线程并发请求,可以高效地处理大量并发连接,提升了处理能力。 2. **连接管理**:它提供了连接池管理,允许重用已建立的TCP连接,减少网络延迟,提高整体性能。 3. **...