教授通过代码示例学习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性能测试的基础。

HostKvm香港VPS七折:$5.95/月KVM-2GB内存/40GB硬盘/500GB月流量

HostKvm是一家成立于2013年的国外主机服务商,主要提供VPS主机,基于KVM架构,可选数据中心包括日本、新加坡、韩国、美国、俄罗斯、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。商家本月针对香港国际机房提供特别7折优惠码,其他机房全场8折,优惠后2G内存香港VPS每月5.95美元起,支持使用PayPal或者支付宝付款。下面以香港国际(HKGlobal)为...

NameCheap 2021年新年首次活动 域名 域名邮局 SSL证书等

NameCheap商家如今发布促销活动也是有不小套路的,比如会在提前一周+的时间告诉你他们未来的活,比如这次2021年的首次活动就有在一周之前看到,但是这不等到他们中午一点左右的时候才有正式开始,而且我确实是有需要注册域名,等着看看是否有真的折扣,但是实际上.COM域名力度也就一般需要51元左右,其他地方也就55元左右。当然,这次新年的首次活动不管如何肯定是比平时便宜一点点的。有新注册域名、企业域...

可抵御99%的攻击中国单域版cdn:9元/月7T防御 cloudsecre

官方网站:点击访问CDN客服QQ:123008公司名:贵州青辞赋文化传媒有限公司域名和IP被墙封了怎么办?用cloudsecre.com网站被攻击了怎么办?用cloudsecre.com问:黑客为什么要找网站来攻击?答:黑客需要找肉鸡。问:什么是肉鸡?答:被控的服务器和电脑主机就是肉鸡。问:肉鸡有什么作用?答:肉鸡的作用非常多,可以用来干违法的事情,通常的行为有:VPN拨号,流量P2P,攻击傀儡,...

httpclient4为你推荐
金士顿内存怎么样金士顿内存条到底怎么样啊?这么多人买?又说90%都是假的?去装机人家推荐我金士顿骇客神条行不行啊?304和316不锈钢哪个好304不锈钢和316不锈钢哪个好二手车网站哪个好想买台二手车,哪个二手车网站靠谱ps软件哪个好什么PS软件好车险哪个好车险平安和人保哪个好?都有什么优点和缺点?看书软件哪个好小说阅读软件哪个好qq空间登录qq空间如何登陆空间登录qq如何在空间里登陆qq360云盘下载速度慢怎么办360网盘下载速度好慢,我这几天下载怎么才30多KB。哪里买机票最便宜订飞机票哪里便宜?
服务器租用托管 北京域名空间 免费vps 韩国加速器 la域名 商家促销 商务主机 铁通流量查询 admit的用法 已备案删除域名 昆明蜗牛家 卡巴斯基免费试用版 网通服务器 沈阳主机托管 免费php空间 广东主机托管 万网服务器 phpwind论坛 防盗链 远程登录 更多