`
jsczxy2
  • 浏览: 1275081 次
  • 性别: Icon_minigender_1
  • 来自: 常州
文章分类
社区版块
存档分类
最新评论

HttpClient如何 关闭连接(转)

阅读更多
Java代码
  1. HttpClient client = new HttpClient();   
  2. HttpMethod method = new GetMethod("http://www.apache.org");   
  3. try {   
  4.   client.executeMethod(method);   
  5.   byte[] responseBody = null;   
  6.      
  7.   responseBody = method.getResponseBody();   
  8.      
  9. catch (HttpException e) {   
  10.   // TODO Auto-generated catch block   
  11.   e.printStackTrace();   
  12. catch (IOException e) {   
  13.   // TODO Auto-generated catch block   
  14.   e.printStackTrace();   
  15. }finally{   
  16.   method.releaseConnection();   
  17.      
  18. }  

大部分人使用HttpClient都是使用类似上面的代码,因为Apache官方例子就是如此。但在使用HttpClient会发现如果不断循环发送大量请求到服务器会导致APACHE服务器的连接被占满,后续的请求便排队等待,程序陷入“假死”状态。
Java代码
  1. Timeout 30  
  2. KeepAlive On   #表示服务器端不会主动关闭链接   
  3. MaxKeepAliveRequests 100  
  4. KeepAliveTimeout 180   

因此这样的配置就会导致每个链接至少要过180S才会被释放,这样在大量请求访问时就必然会造成连接被占满,请求等待的情况。
在 通过DEBUG后发现HttpClient在method.releaseConnection()后并没有把连接关闭,这个方法只是将连接返回给 connection manager。如果使用HttpClient client = new HttpClient()实例化一个HttpClient connection manager默认实现是使用SimpleHttpConnectionManager。SimpleHttpConnectionManager有个构 造函数如下
Java代码
  1.   
  2. public SimpleHttpConnectionManager(boolean alwaysClose) {   
  3.     super();   
  4.     this.alwaysClose = alwaysClose;   
  5. }  

看 方法注释我们就可以看到如果alwaysClose设为true在链接释放之后connection manager 就会关闭链。在我们HttpClient client = new HttpClient()这样实例化一个client时connection manager是这样被实例化的
Java代码
  1. this.httpConnectionManager = new SimpleHttpConnectionManager();  

因此alwaysClose默认是false,connection是不会被主动关闭的,因此我们就有了一个客户端关闭链接的方法。
方法一:
把事例代码中的第一行实例化代码改为如下即可,在method.releaseConnection();之后connection manager会关闭connection 。
Java代码
  1. HttpClient client = new HttpClient(new HttpClientParams(),new SimpleHttpConnectionManager(true) );  

方法二:
实例化代码使用:HttpClient client = new HttpClient();
在method.releaseConnection();之后加上
Java代码
  1. ((SimpleHttpConnectionManager)client.getHttpConnectionManager()).shutdown();  

shutdown源代码很简单,看了一目了然
Java代码
  1. public void shutdown() {   
  2.     httpConnection.close();   
  3. }  

方法三:
实例化代码使用:HttpClient client = new HttpClient();
在method.releaseConnection();之后加上
client.getHttpConnectionManager().closeIdleConnections(0);此方法源码代码如下:
Java代码
  1. public void closeIdleConnections(long idleTimeout) {   
  2.     long maxIdleTime = System.currentTimeMillis() - idleTimeout;   
  3.     if (idleStartTime <= maxIdleTime) {   
  4.         httpConnection.close();   
  5.     }   
  6. }  

将idleTimeout设为0可以确保链接被关闭。
以上这三种方法都是有客户端主动关闭TCP链接的方法。下面再介绍由服务器端自动关闭链接的方法。
方法四:
代码实现很简单,所有代码就和最上面的事例代码一样。只需要在HttpMethod method = new GetMethod("http://www.apache.org");加上一行HTTP头的设置即可
Java代码
  1. method.setRequestHeader("Connection""close");  

看一下HTTP协议中关于这个属性的定义:
HTTP/1.1 defines the "close" connection option for the sender to signal that the connection will be closed after completion of the response. For example,
       Connection: close
现在再说一下客户端关闭链接和服务器端关闭链接的区别。如果采用客户端关闭链接的方法,在客户端的机器上使用netstat –an命令会看到很多TIME_WAIT的TCP链接。如果服务器端主动关闭链接这中情况就出现在服务器端。
参考WIKI上的说明http://wiki.apache.org/HttpComponents/FrequentlyAskedConnectionManagementQuestions
The TIME_WAIT state is a protection mechanism in TCP. The side that closes a socket connection orderly will keep the connection in state TIME_WAIT for some time, typically between 1 and 4 minutes.
TIME_WAIT的状态会出现在主动关闭连接的这一端。TCP协议中TIME_WAIT状态主要是为了保证数据的完整传输。具体可以参考此文档:
http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.7
另外强调一下使用上面这些方法关闭链接是在我们的应用中明确知道不需要重用连接时可以主动关闭连接来释放资源。如果你的应用是需要重用接的话就没必要这么做,使用原有的接还可以提供性能。
分享到:
评论

相关推荐

    实现http协议两端httpserver和httpclient

    5. **关闭连接**:双方在完成数据交换后,关闭套接字连接。 在实际开发中,为了简化流程,可以使用第三方库,如libcurl或Poco,它们提供了更高级别的API,简化了HTTP通信的实现。但是,直接使用套接字编程可以更好...

    httpclient.jar包下载

    1. **连接管理**:HttpClient通过HttpConnectionManager接口控制HTTP连接的创建、复用和关闭,有效地管理连接池,避免了频繁建立新连接带来的性能开销。 2. **请求和响应模型**:HttpClient使用HttpRequest和...

    httpclient

    5. **关闭资源**:执行完请求后,关闭HttpClient和相关连接,释放系统资源。 **四、示例代码** ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...

    httpclient httpclient.jar

    通常,我们创建一个HttpClient实例,并设置其配置参数,如连接超时、重试策略等。 2. **HttpHost**:表示目标HTTP服务器的信息,包括主机名、端口和协议(HTTP或HTTPS)。 3. **HttpGet/HttpPost**:这些是执行...

    使用httpClient访问https+443端口号。

    8. **关闭连接**:记得在完成请求后关闭HttpClient和响应实体,以释放资源。 9. **错误处理**:处理可能出现的异常,如网络问题、认证失败或证书问题。 通过这些步骤,我们可以使用Apache HttpClient库安全地与443...

    httpClient官方文档

    - 连接管理器关闭(Connection Manager Shutdown):介绍了如何正确关闭连接管理器,以释放系统资源。 4. 多线程请求执行(Multithreaded Request Execution) - 处理并发请求的策略和方法。 5. 连接驱逐策略...

    httpClient4.5.1教程

    - 1.2.2 HttpClient资源释放:解释了HttpClient实例的生命周期管理,以及如何正确地关闭HttpClient资源。 1.3 HTTP执行上下文 - 说明了如何使用HTTP执行上下文来管理HTTP连接和请求执行过程中的状态。 1.4 HTTP...

    使用httpclient访问servlet

    HttpClient支持连接池管理,通过`PoolingHttpClientConnectionManager`可以控制并发连接数。同时,可以设置重试策略,如`HttpRequestRetryHandler`,在某些网络问题时自动重试请求。 8. **异步调用**: ...

    HttpClient

    - **连接管理器**:管理器允许对连接池进行高级控制,如连接池的创建和关闭、连接的借出和回收、连接回收策略等。 - **代理配置**:在某些情况下,HTTP请求可能需要通过代理服务器,HttpClient提供了灵活的代理配置...

    Httpclient依赖包

    2. **资源管理**:由于HttpClient涉及到网络连接和线程,因此需要正确管理和关闭资源,避免内存泄漏和连接泄露。 3. **异常处理**:HttpClient抛出的异常通常包含了丰富的错误信息,通过捕获和处理这些异常,可以更...

    Arduino HttpClient 库文件

    6. **关闭连接**:请求完成后,记得调用 `client.stop()` 关闭连接,释放资源。 注意,由于 Arduino 的内存限制,HttpClient 库可能不适用于大数据量的传输。此外,HTTP 请求可能受网络条件、服务器响应时间和 ...

    httpclient-4.5.3 api 中文版

    另外,还可以使用`CloseableHttpResponse`的`EntityUtils.consume()`方法确保在处理完响应后正确关闭连接。 10. **拦截器**:HttpClient 允许使用`HttpRequestInterceptor`和`HttpResponseInterceptor`来在请求发送...

    httpclient3.1 javadoc chm版

    5. HttpConnection:处理与服务器之间的网络连接,包括建立、管理和关闭连接。 6. Cookie管理:HttpClient提供了CookiePolicy和CookieStore接口,用于处理Cookie的接收和发送策略以及存储。 三、使用流程 1. 创建...

    commons-httpclient-3.1jar包

    5. 连接管理:HttpClient 3.1引入了ConnectionManager接口,用于管理HTTP连接,包括连接的创建、复用和关闭。 三、使用步骤 1. 创建HttpClient实例:可以通过HttpParams配置参数,如超时时间、编码等。 2. 创建...

    httpclient4.5源码学习

    2. **连接管理**:`PoolingHttpClientConnectionManager` 负责连接的创建、复用和关闭,通过 `ConnectionKeepAliveStrategy` 和 `ConnectionReuseStrategy` 控制连接的生命周期。 3. **请求构建**:`HttpGet`, `...

    HttpCient连接池Demo

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

    httpclient-4.5.3中文版文档,很实用

    同时,由于HttpClient的灵活性,正确地关闭和管理连接资源也非常重要,以避免资源泄露。 总之,HttpClient 4.5.3是一个强大且灵活的HTTP客户端工具,广泛应用于各种Java应用中,尤其是需要进行大量HTTP通信的场景。...

    apache httpclient jar包

    - **ConnectionManager**:负责管理TCP连接,包括建立、复用和关闭。HttpClient 4.2.5默认使用PoolingHttpClientConnectionManager,它支持连接池,可以提高性能。 - **SocketConfig** 和 **HttpClientBuilder**:...

Global site tag (gtag.js) - Google Analytics