`

HttpClient——关闭连接

 
阅读更多
  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服务器的链接被占满,后续的请求便排队等待。 
我服务器端APACHE的配置 

Java代码  收藏代码
  1. Timeout 30  
  2. KeepAlive On   #表示服务器端不会主动关闭链接  
  3. MaxKeepAliveRequests 100  
  4. KeepAliveTimeout 180   


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

Java代码  收藏代码
  1. /** 
  2.  * The connection manager created with this constructor will try to keep the  
  3.  * connection open (alive) between consecutive requests if the alwaysClose  
  4.  * parameter is set to <tt>false</tt>. Otherwise the connection manager will  
  5.  * always close connections upon release. 
  6.  *  
  7.  * @param alwaysClose if set <tt>true</tt>, the connection manager will always 
  8.  *    close connections upon release. 
  9.  */  
  10. public SimpleHttpConnectionManager(boolean alwaysClose) {  
  11.     super();  
  12.     this.alwaysClose = alwaysClose;  
  13. }  


看方法注释我们就可以看到如果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通信的实现。但是,直接使用套接字编程可以更好...

    http请求工具类HttpClientUtil,get,post请求(csdn)————程序.pdf

    在 HttpClientUtil 中,`EntityUtils` 被用来读取和关闭响应实体。`EntityUtils.toString` 用于将 HttpEntity 转换为字符串,便于进一步解析或操作。 6. **使用示例**: 用户可以调用 `doGetJson` 或 `doPostJson`...

    httpclient4.4

    《HttpClient 4.4详解——构建高效可靠的网络通信》 HttpClient是Apache软件基金会下的一个开源项目,主要提供了Java语言环境下的HTTP客户端编程接口。HttpClient 4.4版本是该库的一个重要里程碑,它在功能、性能和...

    HttpClient.zip_HTTP_c++ httpclass_c++ httpclient类_http client c+

    6. **连接管理**:为了提高效率,HttpClient可能会使用连接池来复用TCP连接,减少每次请求的建立和关闭连接的时间开销。 7. **异步处理**:为了支持非阻塞的网络I/O,HttpClient可能提供异步版本的请求方法,如`...

    httpclient jar 包 4.5

    在标题“httpclient jar 包 4.5”中提到的,是HttpClient的一个特定版本——4.5。这个版本不仅包含了HttpClient的核心功能,还可能包含了其他相关组件,以提供一个完整的HTTP客户端解决方案。描述中提到的“包含所有...

    httpcore-4.2.4,httpclient-4.2.5,httpclient-cache-4.2.5,httpmime-4.2.5的jar包下载

    这里提到的四个jar包——httpcore-4.2.4,httpclient-4.2.5,httpclient-cache-4.2.5,httpmime-4.2.5,都是Apache HttpClient库的不同组件,用于支持HTTP通信和相关功能。 **httpcore-4.2.4.jar** 是HTTP Core模块...

    HTTPClient.zip

    本篇文章将详细讲解基于C++实现的HTTPClient库及其使用方法,参考自提供的链接——"C++ HttpClient亲测好用,使用方法"。 首先,我们来看`HttpClient.cpp`和`HttpClient.h`这对源代码文件。`HttpClient.h`通常包含...

    使用HttpClient获取网页html源代码.zip

    在这个名为"使用HttpClient获取网页html源代码.zip"的压缩包中,包含了一个简单的示例项目——WebDataShow,用于演示如何使用HttpClient获取网页HTML。 首先,我们需要导入Apache HttpClient库。在Android Studio中...

    httpclient jar

    比如,HttpClient的HttpConnectionManager可以控制连接的创建、复用和关闭,HttpClient还可以配置连接超时、读取超时等参数,以适应不同的网络环境和应用需求。 在实际项目中,HttpClient常常与其他库结合使用,...

    http client 4.2

    1. **连接管理**:HttpClient 4.2引入了连接池管理器,可以复用TCP连接,显著提高了网络通信效率,减少了建立和关闭连接的开销。 2. **多路复用**:支持HTTP/1.1的Keep-Alive机制,允许多个HTTP请求共享一个TCP连接...

    Android例子源码使用HttpClient获取网页html源代码

    本例子源码展示了如何利用Apache HttpClient库来实现这一功能,同时也对比了另一种常见的网络访问方式——URLConnection。以下是对这两个方法的详细解释。 首先,我们来看`HttpClient`的使用。Apache HttpClient是...

    Android网络连接2——HttpURLConnection

    `HttpURLConnection`相比旧版的`HttpClient`,具有更好的性能和更低的资源消耗,因此被推荐作为首选的网络连接方式。 `HttpURLConnection`是Java的标准库类,它位于`java.net`包下,可以直接在Android项目中使用。...

    httpclient-master.zip

    6. 连接关闭:通信完成后,客户端和服务器通过四次挥手断开连接。 七、应用场景 1. 嵌入式设备:在物联网设备、智能家居等领域,轻量级且不依赖外部库的HTTP客户端是非常理想的。 2. 自动化测试:在API自动化测试...

    httpclients

    1. **连接管理**:HttpClient需要管理与服务器的连接,包括创建、复用和关闭连接,以提高性能和减少资源消耗。HttpClient的`PoolingHttpClientConnectionManager`负责这项工作。 2. **请求配置**:你可以定制请求头...

    安卓Android源码——http1.rar

    - 关闭连接,调用disconnect()方法。 2. 源码解析: HttpURLConnection在Android源码中位于`libcore/luni/src/main/java/libcore/net/http`目录下。其内部实现了连接管理、重定向处理、缓存策略等功能。通过对`...

    httpclient 4.4 jar包

    CloseableHttpClient是HTTPClient 4.4中的一个关键类,它是HttpClient接口的实现,添加了自动关闭连接的功能。这个类的引入解决了旧版本中资源管理的问题,防止了内存泄漏和过多的开放连接,从而提高了程序的健壮性...

    SingleClientConnManager.rar_Only

    《单客户端连接管理器——SingleClientConnManager》 在计算机网络编程中,连接管理是至关重要的部分,尤其是在处理HTTP协议的请求时。标题中的“SingleClientConnManager.rar_Only”暗示我们正在探讨一个专为单...

    java实现http连接服务器[参考].pdf

    12. 关闭输入流和输出流,释放资源。 在实际应用中,可能还需要处理其他情况,如错误处理、HTTP状态码检查、添加HTTP头信息、处理不同类型的响应体等。例如,对于POST请求,通常会将参数写入输出流;对于GET请求,...

    安卓Android源码——网络监视器源码 (2).zip

    2. **网络状态监听**:源码中可能包含BroadcastReceiver,用于监听网络连接状态的变化,如Wi-Fi、移动数据的开启或关闭。当网络状态改变时,广播接收器会接收到ACTION_NETWORK_STATE_CHANGED广播,从而触发相应的...

    httpcomponents-client-4.5.2-bin.tar.gz

    以上代码创建了一个默认的HttpClient实例,发起一个GET请求到指定URL,并打印出响应状态行,最后关闭连接。 总之,Apache HttpClient是Java开发者进行HTTP通信的首选工具,尽管其非标准库的身份可能导致导入问题,...

Global site tag (gtag.js) - Google Analytics