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
相关推荐
HttpClient连接池是网络编程中一个重要的优化手段,它允许我们重用已经建立的HTTP连接,减少每次请求时的建立和关闭连接的开销,从而提高应用程序的性能和效率。Apache HttpClient库提供了这样的功能,让我们能够...
- **HttpClientBuilder**:用于构建和配置HttpClient实例,可以设置连接池大小、超时时间等。 - **PoolingHttpClientConnectionManager**:管理HTTP连接的池,提高性能和复用性。 4. **请求头和实体**: - **...
10. **性能优化**:HttpClient 4.3通过连接池和多线程等技术提高了性能。你还可以根据需求调整并发数、超时时间和连接超时。 这个"HttpClient Demo"工程应该包含了示例代码,展示了如何使用HttpClient进行HTTP通信...
HttpClient提供了`CredentialsProvider`用于设置认证信息,`CookieStore`用于管理Cookie,`PoolingHttpClientConnectionManager`用于连接池管理,`RedirectStrategy`用于控制重定向策略。 文件名"dom4j及http请求...
- 创建HttpClient实例:通常我们会使用`HttpClientBuilder`或`HttpAsyncClientBuilder`来构建HttpClient对象,配置连接池、超时时间等参数。 - 构建HttpGet或HttpPost等请求对象:通过`HttpRequestBase`子类如`...
HttpClient还支持HTTP连接管理,如连接池,可以通过`PoolingHttpClientConnectionManager`实现。连接池可以复用已建立的TCP连接,减少网络延迟,提高性能。同时,HttpClient提供了超时设置,如连接超时、请求超时和...
在实际应用中,可能还需要处理其他复杂的场景,如设置超时、处理重定向、管理连接池等。HttpClient提供了丰富的API来应对这些挑战,使开发者能够灵活地构建和控制网络请求。 通过这个案例,我们不仅学习了...
HttpClient还提供了许多高级功能,如重试策略、连接池管理、HTTPS支持、自定义请求头等。对于复杂的HTTP请求,可以使用`HttpContext`上下文对象存储请求相关的状态和数据。 在实际的网页抓取任务中,通常需要处理...
此外,对于HTTPClient的性能优化,如连接池的使用、超时设置等也是需要考虑的方面。 总的来说,使用Java的HTTPClient库发送HTTPS请求涉及到SSL/TLS协议的理解、证书管理以及HTTPClient的配置和使用。这个过程既包含...
3. **连接管理**: 可以设置连接池,优化连接复用,减少网络延迟。 4. **重定向处理**: 自动处理HTTP状态码3xx的重定向。 5. **HTTP/1.1和HTTP/2支持**: 支持两种HTTP协议版本,以适应不同的服务器需求。 6. **多线程...
HttpClient接口调用工具类 (Post请求 get请求 put请求 delete请求 (附带调用demo) 下载就可以用 ) 可设置httpclient的连接池大小,连接池最大并发连接数,单路由最大并发数设
高效的HTTP请求需要良好的连接管理,HttpClient提供了`PoolingHttpClientConnectionManager`来管理连接池,提高性能和并发能力。 9. **安全性**: HttpClient还可以处理HTTPS连接,支持SSL/TLS协议,确保数据传输...
通过使用HttpClient的连接池和多线程,我们可以有效地并发执行HTTP GET请求,同时控制并发数量,避免过多的网络连接导致服务器压力过大。这种方式提高了请求效率,减少了资源消耗,并且遵循了最佳实践。
HttpClient提供了丰富的功能,包括支持HTTP协议的各种方法(GET、POST等),处理Cookie,管理连接池,以及进行身份验证等。这个库在开发需要与Web服务器交互的应用程序时非常有用。 在描述中提到的"demo"意味着我们...
它提供了丰富的API来执行HTTP方法(如GET、POST等)、管理连接池、设置请求头和参数、处理重定向等,是进行网络爬虫开发的重要工具。 在项目中,我们可能首先会创建一个Spring Boot启动类,配置相关依赖,并利用`@...
4. **OkHttp库**:由于HttpURLConnection存在一些局限,例如不支持超时设置、连接池管理等,开发者通常会使用第三方库如OkHttp。OkHttp提供了更高效、更易用的API,并且内置了连接池,能提高请求速度。 5. **网络...
这个示例展示了HttpClient的基本用法,但实际使用时,你可能需要根据具体需求进行更复杂的操作,如POST请求、文件上传、重试策略、连接池管理等。HttpClient提供了丰富的API来支持这些高级功能,使其成为Java HTTP...
2. 配置:根据需要,我们可以配置Forest或HttpClient的连接池、超时时间等参数。 3. 编写API调用代码:使用Forest的注解或者Okhttp、HttpClient的API编写调用接口的代码,处理请求和响应。 4. 异常处理:添加适当的...
Apache HTTP 是一个强大的开源Web服务器软件,被广泛用于互联网服务。...在开发过程中,确保遵循最佳实践,如使用try-with-resources语句处理资源关闭,以及适当管理并发和连接池,以提高性能和稳定性。
2. **HttpClient**(通常指的是Apache HttpClient库)提供了更高级的功能,如异步请求、重试策略和连接池管理。对于复杂的网络操作,HttpClient通常更合适。在demo中,我们将学习如何配置HttpClient,创建请求并处理...