`
m635674608
  • 浏览: 5043189 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

httpclient http连接池 demo

    博客分类:
  • java
 
阅读更多

HttpClient4.x之前没有连接池的概念,多少次请求就会建立多少个IO,在访问量巨大的情况下服务器的IO可能会耗尽。最新HttpClient4.2有连接池的东西在里头,使用PoolingClientConnectionManager,具体可以参考官方文档,里面有详细介绍。

关于PoolingClientConnectionManager
介绍原文是这样的:

 

PoolingClientConnectionManager is a more complex implementation that manages a pool of client connections and is able to service connection requests from multiple execution threads. Connections are pooled on a per route basis.
A request for a route for which the manager already has a persistent connection available in the pool will be serviced by leasing a connection from the pool rather than creating a brand new connection.

PoolingClientConnectionManager maintains a maximum limit of connections on a per route basis and in total. Per default this implementation will create no more than 2 concurrent connections per given route and no more 20 connections
in total. For many real-world applications these limits may prove too constraining, especially if they use HTTP as a transport protocol for their services. Connection limits can be adjusted using the appropriate HTTP parameters.

 

示例:

HttpConnectionManager.java

 

public class HttpConnectionManager { 

	private static HttpParams httpParams;
	private static PoolingClientConnectionManager cm;

	/**
	 * 最大连接数
	 */
	public final static int MAX_TOTAL_CONNECTIONS = 200;
	/**
	 * 获取连接的最大等待时间
	 */
	public final static int WAIT_TIMEOUT = 60000;
	/**
	 * 每个路由最大连接数
	 */
	public final static int MAX_ROUTE_CONNECTIONS = 300;
	/**
	 * 连接超时时间
	 */
	public final static int CONNECT_TIMEOUT = 10000;
	/**
	 * 读取超时时间
	 */
	public final static int READ_TIMEOUT = 10000;

	static {
		SchemeRegistry schemeRegistry = new SchemeRegistry();
		schemeRegistry.register(
				new Scheme("http",80,PlainSocketFactory.getSocketFactory()));
		schemeRegistry.register(
				new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
		
		cm = new PoolingClientConnectionManager(schemeRegistry);
		cm.setMaxTotal(200);
		cm.setDefaultMaxPerRoute(80);
		
		HttpParams params = new BasicHttpParams();
		params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,CONNECT_TIMEOUT);
		params.setParameter(CoreConnectionPNames.SO_TIMEOUT, READ_TIMEOUT);
	}

	public static HttpClient getHttpClient() {
		return new DefaultHttpClient(cm, httpParams);
	}

}

DownloadTask.java

 

import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.params.CoreConnectionPNames;

public class DownloadTask implements Runnable {

	private HttpClient httpClient = HttpConnectionPoolManager.getHttpClient();

	@Override
	public void run() {
		
		String url = "http://www.baidu.com";
		download(url);
	}

	public void download(String url) {

		
		HttpGet httpget = null;
		InputStream in = null;

		try {
			httpget = new HttpGet(url);

			httpget.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1");
			httpget.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
			httpget.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,1000 * 20);
			
			HttpResponse resp = httpClient.execute(httpget);

			int respCode = resp.getStatusLine().getStatusCode();

			if (respCode == HttpStatus.SC_OK) {

				HttpEntity entity = resp.getEntity();

				if (entity != null) {

					in = entity.getContent();

					sleep(1000);

					System.out.println("请求成功了..."
							+ Thread.currentThread().getName() + url);
				}

			} else {
				System.out.println("请求失败了..."
						+ Thread.currentThread().getName() + url);
				if(httpget!=null)
					httpget.abort();
			}

		} catch (ClientProtocolException e) {
			e.printStackTrace();
			if(httpget!=null)
				httpget.abort();

		} catch (IOException e) {
			e.printStackTrace();
			if(httpget!=null)
				httpget.abort();

		} catch (Exception e) { // 捕获最大的异常
			e.printStackTrace();
			if(httpget!=null)
				httpget.abort();
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void sleep(int time) throws InterruptedException {
		Thread.sleep(time);
	}
}

测试类

 

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		for(int i=0;i<8;i++){
			new Thread(new DownloadTask()).start();
		}
		
	}

}

 

http://www.xuebuyuan.com/2006070.html

分享到:
评论

相关推荐

    HttpCient连接池Demo

    HttpClient连接池是网络编程中一个重要的优化手段,它允许我们重用已经建立的HTTP连接,减少每次请求时的建立和关闭连接的开销,从而提高应用程序的性能和效率。Apache HttpClient库提供了这样的功能,让我们能够...

    httpClient4.3 Jar包 demo

    - **HttpClientBuilder**:用于构建和配置HttpClient实例,可以设置连接池大小、超时时间等。 - **PoolingHttpClientConnectionManager**:管理HTTP连接的池,提高性能和复用性。 4. **请求头和实体**: - **...

    HttpClient Demo

    10. **性能优化**:HttpClient 4.3通过连接池和多线程等技术提高了性能。你还可以根据需求调整并发数、超时时间和连接超时。 这个"HttpClient Demo"工程应该包含了示例代码,展示了如何使用HttpClient进行HTTP通信...

    httpclient Demo

    HttpClient提供了`CredentialsProvider`用于设置认证信息,`CookieStore`用于管理Cookie,`PoolingHttpClientConnectionManager`用于连接池管理,`RedirectStrategy`用于控制重定向策略。 文件名"dom4j及http请求...

    HttpClient_Demo

    - 创建HttpClient实例:通常我们会使用`HttpClientBuilder`或`HttpAsyncClientBuilder`来构建HttpClient对象,配置连接池、超时时间等参数。 - 构建HttpGet或HttpPost等请求对象:通过`HttpRequestBase`子类如`...

    Apache HttpClient Demo

    HttpClient还支持HTTP连接管理,如连接池,可以通过`PoolingHttpClientConnectionManager`实现。连接池可以复用已建立的TCP连接,减少网络延迟,提高性能。同时,HttpClient提供了超时设置,如连接超时、请求超时和...

    httpclient Demo 案例 含jar

    在实际应用中,可能还需要处理其他复杂的场景,如设置超时、处理重定向、管理连接池等。HttpClient提供了丰富的API来应对这些挑战,使开发者能够灵活地构建和控制网络请求。 通过这个案例,我们不仅学习了...

    HttpClient抓取网页Demo

    HttpClient还提供了许多高级功能,如重试策略、连接池管理、HTTPS支持、自定义请求头等。对于复杂的HTTP请求,可以使用`HttpContext`上下文对象存储请求相关的状态和数据。 在实际的网页抓取任务中,通常需要处理...

    给予javaWeb-httpclient请求https实例demo

    此外,对于HTTPClient的性能优化,如连接池的使用、超时设置等也是需要考虑的方面。 总的来说,使用Java的HTTPClient库发送HTTPS请求涉及到SSL/TLS协议的理解、证书管理以及HTTPClient的配置和使用。这个过程既包含...

    httpcore-httpclient-demo.zip

    3. **连接管理**: 可以设置连接池,优化连接复用,减少网络延迟。 4. **重定向处理**: 自动处理HTTP状态码3xx的重定向。 5. **HTTP/1.1和HTTP/2支持**: 支持两种HTTP协议版本,以适应不同的服务器需求。 6. **多线程...

    HttpClient接口调用工具类 (附带调用demo)

    HttpClient接口调用工具类 (Post请求 get请求 put请求 delete请求 (附带调用demo) 下载就可以用 ) 可设置httpclient的连接池大小,连接池最大并发连接数,单路由最大并发数设

    HttpClient接口调用工具类(附带demo)

    高效的HTTP请求需要良好的连接管理,HttpClient提供了`PoolingHttpClientConnectionManager`来管理连接池,提高性能和并发能力。 9. **安全性**: HttpClient还可以处理HTTPS连接,支持SSL/TLS协议,确保数据传输...

    使用java的HttpClient实现多线程并发

    通过使用HttpClient的连接池和多线程,我们可以有效地并发执行HTTP GET请求,同时控制并发数量,避免过多的网络连接导致服务器压力过大。这种方式提高了请求效率,减少了资源消耗,并且遵循了最佳实践。

    httpclient

    HttpClient提供了丰富的功能,包括支持HTTP协议的各种方法(GET、POST等),处理Cookie,管理连接池,以及进行身份验证等。这个库在开发需要与Web服务器交互的应用程序时非常有用。 在描述中提到的"demo"意味着我们...

    Spring-boot httpclient mysql爬取京东数据

    它提供了丰富的API来执行HTTP方法(如GET、POST等)、管理连接池、设置请求头和参数、处理重定向等,是进行网络爬虫开发的重要工具。 在项目中,我们可能首先会创建一个Spring Boot启动类,配置相关依赖,并利用`@...

    Android应用源码之http 演示Demo_演示.zip

    4. **OkHttp库**:由于HttpURLConnection存在一些局限,例如不支持超时设置、连接池管理等,开发者通常会使用第三方库如OkHttp。OkHttp提供了更高效、更易用的API,并且内置了连接池,能提高请求速度。 5. **网络...

    HttpClient 需要的JAR包和例子

    这个示例展示了HttpClient的基本用法,但实际使用时,你可能需要根据具体需求进行更复杂的操作,如POST请求、文件上传、重试策略、连接池管理等。HttpClient提供了丰富的API来支持这些高级功能,使其成为Java HTTP...

    基于Springboot的Forest调用第三方API Demo

    2. 配置:根据需要,我们可以配置Forest或HttpClient的连接池、超时时间等参数。 3. 编写API调用代码:使用Forest的注解或者Okhttp、HttpClient的API编写调用接口的代码,处理请求和响应。 4. 异常处理:添加适当的...

    apachehttp demo

    Apache HTTP 是一个强大的开源Web服务器软件,被广泛用于互联网服务。...在开发过程中,确保遵循最佳实践,如使用try-with-resources语句处理资源关闭,以及适当管理并发和连接池,以提高性能和稳定性。

    http请求网络解析xml以及JSON的demo

    2. **HttpClient**(通常指的是Apache HttpClient库)提供了更高级的功能,如异步请求、重试策略和连接池管理。对于复杂的网络操作,HttpClient通常更合适。在demo中,我们将学习如何配置HttpClient,创建请求并处理...

Global site tag (gtag.js) - Google Analytics