教授通过代码示例学习Commons HTTPClient4组件的编程技术——多线程模式下使用HttpClient4组件

httpclient4  时间:2021-01-29  阅读:()

杨教授工作室精心创作的优秀程序员职业提升必读系列资料

1. 1 多线程模式下使用HttpClient4组件

1. 1. 1 ThreadSafeClientConnManager类

1、对于同一个HttpConnection同一个时间只能有一个线程访问

由于连接是一种有限的资源每个连接在某一时刻只能供一个线程和方法使用所以需要确保在需要时正确地分配连接。HttpC lient采用了一种类似jdbc连接池的方法来管理连接这个管理工作由MultiThreadedHttpConnec tio nManager完成。

为了保证多线程工作环境下不产生冲突 httpc lie nt使用了一个多线程连接管理器的类ThreadS a feC lientCo nnManager。

2、 ThreadS a feC lie ntC o nnManager类

ThreadSafeClientConnManager类支持下面的两个默认设置项目

 ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE每个主机的最大并行链接数默认为2

 ConnManagerPNames.MAX_TOTAL_CONNECTIONS客户端总并行链接最大数默认为20

3、 SchemeRegistry类

4、添加一个线程类

1类名称为MultiGetThread包名称为co m.p x1987.httpc lient并且继承j ava.lang.Thread

杨教授工作室版权所有盗版必究 1/7页

杨教授工作室精心创作的优秀程序员职业提升必读系列资料类

2编程该类的代码package com.px1987.httpclient;import java. io. IOException;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.protocol.BasicHttpContext;import org.apache.http.protocol.HttpContext;import org.apache.http.util.EntityUtils;public class MultiGetThread extends Thread {

杨教授工作室精心创作的优秀程序员职业提升必读系列资料private final HttpClient httpClient;private final HttpContext context;private final HttpGet httpGetMethod;private final int threadNo;public MultiGetThread(HttpClient httpClient, HttpGet httpGetMethod, intthreadNo) {this.httpClient = httpClient;this.context = new BasicHttpContext() ;this.httpGetMethod = httpGetMethod;this. threadNo = threadNo;

}

@Overridepublic void run() {

System.out.println(threadNo + " 号 线 程 将要 访 问  " +httpGetMethod.getURI() ) ;try {

HttpResponse response = httpClient.execute(httpGetMethod, context) ;

HttpEntity entity = response.getEntity() ;if (entity != null) {byte[] bytes = EntityUtils. toByteArray(entity) ;

System.out.println(threadNo + "号线程获得长度为" + bytes. length + "字节数据。 ") ;

}

} catch (IOException exception) {

System.out.println(threadNo+"号线程执行过程中出现了下面的错误 "+exception) ;

}finally{httpGetMethod.abort() ;

}

杨教授工作室版权所有盗版必究 3/7页

杨教授工作室精心创作的优秀程序员职业提升必读系列资料}

}

注意需要对每一个HttpClient.execute()的调用必须要有一个abort()与之匹配。

5、多线程模式下使用HttpC lient的代码示例——HttpC lientMultiThreadedDemo

1在项目中添加HttpClientMultiThreadedDemo类

2代码示例package com.px1987.httpclient;import org.apache.http.HttpVersion;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.params.ConnManagerParams;import org.apache.http.conn. scheme.PlainSocketFactory;

杨教授工作室精心创作的优秀程序员职业提升必读系列资料import org.apache.http.conn. scheme.Scheme;import org.apache.http.conn. scheme.SchemeRegistry;import org.apache.http.conn. ssl.SSLSocketFactory;import org.apache.http. impl.client.DefaultHttpClient;import org.apache.http. impl.conn. tsccm.ThreadSafeClientConnManager;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpParams;import org.apache.http.params.HttpProtocolParams;public class HttpClientMultiThreadedDemo {

HttpClient httpClient=null;public HttpClientMultiThreadedDemo() {

HttpParams params = new BasicHttpParams() ;

ConnManagerParams. setMaxTotalConnections(params, 100) ;

HttpProtocolParams. setVersion(params, HttpVersion.HTTP_1_1) ;

SchemeRegistry schemeRegistry = new SchemeRegistry() ;schemeRegistry.register(new Scheme("http",

PlainSocketFactory.getSocketFactory() , 8080) ) ;schemeRegistry.register(new Scheme("https",

SSLSocketFactory.getSocketFactory() , 8443) ) ;

ClientConnectionManager cm = new ThreadSafeClientConnManager(params,schemeRegistry) ;httpClient = new DefaultHttpClient(cm, params) ;

String targetURIToGet = "http://127. 0.0. 1:8080/webbank/index. jsp";MultiGetThread[] threads = new MultiGetThread[10] ;for (int i = 0; i < threads. length; i++) {

HttpGet httpGetMethod = new HttpGet(targetURIToGet) ;threads[i] = new MultiGetThread(httpClient, httpGetMethod, i + 1) ;threads[i] . start() ;

}

/*

杨教授工作室版权所有盗版必究 5/7页

杨教授工作室精心创作的优秀程序员职业提升必读系列资料

*不能再此释放连接 因为在线程中海需要应用 httpClient对象本示例为异

步请求

*/

// httpClient.getConnectionManager() . shutdown() ;

}protected void finalize() {httpCl ient.getConnectionManager() . shutdown() ; //释放连接

}public static void main(String[] args) throws Exception {

HttpClientMultiThreadedDemo httpClientMultiThreadedDemo=newHttpClientMultiThreadedDemo() ;

}

}

在客户端的代码中同时产生出10个线程 向同一个URL地址发送请求。注意释放httpClient对象的方式否则会出现下面的错误。

6、示例代码执行的结果

杨教授工作室版权所有盗版必究 6/7页

杨教授工作室精心创作的优秀程序员职业提升必读系列资料

该示例其实是Web性能测试的基础。

青云互联:美国洛杉矶CN2弹性云限时八折,15元/月起,可选Windows/可自定义配置

青云互联怎么样?青云互联是一家成立于2020年6月的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,目前提供有美国免费主机、香港主机、香港服务器、美国云服务器,让您的网站高速、稳定运行。美国cn2弹性云主机限时8折起,可选1-20个IP,仅15元/月起,附8折优惠码使用!点击进入:青云互联官方网站地址青云互联优惠码:八折优惠码:ltY8sHMh (续费同价)青云互联活动方案:美国洛杉矶...

华纳云CN2高防1810M带宽独享,三网直cn218元/月,2M带宽;独服/高防6折购

华纳云怎么样?华纳云是香港老牌的IDC服务商,成立于2015年,主要提供中国香港/美国节点的服务器及网络安全产品、比如,香港服务器、香港云服务器、香港高防服务器、香港高防IP、美国云服务器、机柜出租以及云虚拟主机等。以极速 BGP 冗余网络、CN2 GIA 回国专线以及多年技能经验,帮助全球数十万家企业实现业务转型攀升。华纳云针对618返场活动,华纳云推出一系列热销产品活动,香港云服务器低至3折,...

UCloud云服务器低至年59元

最近我们是不是在讨论较多的是关于K12教育的问题,培训机构由于资本的介入确实让家长更为焦虑,对于这样的整改我们还是很支持的。实际上,在云服务器市场中,我们也看到内卷和资本的力量,各大云服务商竞争也是相当激烈,更不用说个人和小公司服务商日子确实不好过。今天有看到UCloud发布的夏季促销活动,直接提前和双十一保价挂钩。这就是说,人家直接在暑假的时候就上线双十一的活动。早年的双十一活动会提前一周到十天...

httpclient4为你推荐
锦天城和君合哪个好记忆棉和乳胶哪个好游戏加速器哪个好网游加速器那个好?51个人空间登录为什么登陆51博客个人空间就不能登陆QQqq空间登录网址如何查询QQ空间登入地址?东莞电信网上营业厅东莞电信网上营业厅是不是有个宽带团购活动?dns服务器未响应电脑网络连接不到,DNS服务器未响应是什么意思?网通dns服务器地址中国联通的默认DNS是多少360云存储360网盘目前最大空间是多少360云盘关闭360云盘关闭个人云盘是吗?广东联通网络传真如何使用广东联通如意传真?
com域名注册1元 重庆域名注册 郑州服务器租用 vps是什么 国外永久服务器 cloudstack 512m 论坛空间 空间服务商 anylink 免费防火墙 卡巴斯基试用版 卡巴斯基免费试用版 国外在线代理服务器 镇江高防 国内空间 卡巴斯基试用版下载 汤博乐 mteam 服务器是什么 更多