本文转截自: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方法 哎~~
相关推荐
这个比xutils强多了。用过服务端交互框架的都知道
主要介绍了使用java的HttpClient实现多线程并发的相关资料,需要的朋友可以参考下
4、多线程下载:使用RandomAccessFile输出流写 5、多线程下载-断点续传:使用临时文件记录当前下载的数据,下次读取文件开始下载 6、下载显示进度条-ProgressBar 7、在gitbub上面下载已经有支持断点续传功能的代码...
httpclient post例子,多线程
NULL 博文链接:https://eric-wyf.iteye.com/blog/1179729
NULL 博文链接:https://zywang.iteye.com/blog/916489
NULL 博文链接:https://theoffspring.iteye.com/blog/1610345
NULL 博文链接:https://hrsvici412.iteye.com/blog/789460
HttpClient下载数据 图片,string 使用get请求数据
多线程代理IP池,一直看到有关这方面的技术,最近实现了一个。简单的来说,启动后,会一直定时的获取代理ip,并自动检测代理ip的活跃度。运用多线程的技术,在极短的时间内获取大量的ip进行筛选。架构也比较清楚,...
HttpClient多线程网络下载 经典案例源代码
简单实现的源码,不会自动判断断点恢复,需要手动注释掉相应代码。 博文链接:https://calmness.iteye.com/blog/220075
httpclient4.3的二次封装,解决了代理问题、多线程问题、SSL问题、通用的get、post请求
很多公司使用另开线程池的方式进行异步调用来解决tomcat线程阻塞问题。但由于本系统中接口网络太不稳定,使用线程池也将导致线程池中的线程不断加大,不管使用怎样的线程池策略,最终要么线程池线程全部挂起,要么...
9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。 10. 自动处理Set-Cookie中的Cookie。 11. 插件式的自定义Cookie策略。 12. Request的输出流可以避免...
封装基础的QTcpSocket、QThread...服务器监听后,每新来一个连接起一个线程,完全线程独立; 通过socketDescrptor传递socket; 不建议工程中使用该种模式,这只是一个简单的demo学习了解即可; 实际工程开发建议boost;
这个是一个httpclient模拟发送请求的例子,请求对象是12306,我只写到了登录和查询从...希望有人可以在我的基础上修改成多线程,在确定买那个车次的票的时候可以无限制抢票知道票没有。最后希望大家能开心过年,浪心
java 多线程抓取去哪儿qunar机票数据,依赖 httpclient ,jsoud 等jar 包
Java的线程回顾 匿名内部类 Android的多线程技术之Handler Android的多线程技术之AsyncTask HTTP概述 HTTPClient