JAVA: httpclient 详解——第二章; - Go语言中文社区

JAVA: httpclient 详解——第二章;


相对于httpurlconnection ,httpclient更加丰富,也更加强大,其中apache有两个项目都是httpclient,一个是commonts包下的,这个是通用的,更专业的是org.apache.http.包下的,所以我一般用后者;


httpclient可以处理长连接,保存会话,重连接,以及请求过滤器,连接重用等等...


下面是测试代码(全部总结来自官方文档,以及翻译)


须要下载核心包:httpclient-4.3.4.jar ,也可在官网下载:http://hc.apache.org/downloads.cgi




  1. //=======================================第二章================================================  
  2.       
  3.     /** 
  4.      * 多线程并发访问服务器 
  5.      *  
  6.      * 每次http连接需要三次握手,开销很大,http/1.1默认支持连接复用; 
  7.      *  
  8.      * PoolingHttpClientConnectionManager 允许管理器限制最大连接数 ,还允许每个路由器针对某个主机限制最大连接数。 
  9.      *  
  10.      * 如下:setDefaultMaxPerRoute(3)之后,每次并发3个访问,所以打印输出是每次输出三个"test",验证了http连接管理器生效; 
  11.      *  
  12.      */  
  13.     private static void test9() throws InterruptedException,ExecutionException, IOException {  
  14.           
  15.         PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();  
  16.         connManager.setMaxTotal(200);//设置最大连接数200  
  17.         connManager.setDefaultMaxPerRoute(3);//设置每个路由默认连接数  
  18.         HttpHost host = new HttpHost("webservice.webxml.com.cn");//针对的主机  
  19.         connManager.setMaxPerRoute(new HttpRoute(host), 5);//每个路由器对每个服务器允许最大5个并发访问  
  20.           
  21.         CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connManager).build();  
  22.           
  23.         String[] urisToGet = {   
  24.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",  
  25.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",   
  26.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",  
  27.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",   
  28.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",  
  29.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",   
  30.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",  
  31.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",   
  32.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo",  
  33.                 "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getDatabaseInfo" };  
  34.           
  35.         GetThread[] threads = new GetThread[urisToGet.length];  
  36.           
  37.         for (int i = 0; i < threads.length; i++) {  
  38.             HttpGet httpget = new HttpGet(urisToGet[i]);  
  39.             threads[i] = new GetThread(httpClient, httpget);  
  40.         }  
  41.           
  42.         for (int j = 0; j < threads.length; j++) {  
  43.             threads[j].start();  
  44.         }  
  45.           
  46.         for (int j = 0; j < threads.length; j++) {  
  47.             threads[j].join();  
  48.         }  
  49.                   
  50.                   
  51.     }  
  52.       
  53.     static class GetThread extends Thread {  
  54.         private final CloseableHttpClient httpClient;  
  55.         private final HttpContext context;  
  56.         private final HttpGet httpget;  
  57.   
  58.         public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {  
  59.             this.httpClient = httpClient;  
  60.             this.context = HttpClientContext.create();  
  61.             this.httpget = httpget;  
  62.         }  
  63.           
  64.         @Override  
  65.         public void run() {  
  66.             try {  
  67.                 CloseableHttpResponse response = httpClient.execute(httpget, context);  
  68.                 try {  
  69.                     HttpEntity entity = response.getEntity();  
  70.                     if(entity!=null){  
  71.                         System.out.println("test");  
  72.                     }  
  73.                 } finally {  
  74.                     response.close();  
  75.                 }  
  76.             } catch (ClientProtocolException ex) {  
  77.             } catch (IOException ex) {  
  78.             }  
  79.         }  
  80.     }  
  81.       
  82.       
  83.     /** 
  84.      *  清空失效连接: 
  85.      *  
  86.      *  连接的有效性检测是所有连接池都面临的一个通用问题,大部分HTTP服务器为了控制资源开销,并不会 
  87.         永久的维护一个长连接,而是一段时间就会关闭该连接。放回连接池的连接,如果在服务器端已经关闭,客 
  88.         户端是无法检测到这个状态变化而及时的关闭Socket的。这就造成了线程从连接池中获取的连接不一定是有效的。 
  89.         这个问题的一个解决方法就是在每次请求之前检查该连接是否已经存在了过长时间,可能已过期。 
  90.         但是这个方法会使得每次请求都增加额外的开销。HTTP Client4.0的HttpClientConnectionManager 提供了 
  91.         closeExpiredConnections()方法和closeIdleConnections()方法来解决该问题。 
  92.         前一个方法是清除连接池中所有过期的连接,至于连接什么时候过期可以设置,设置方法将在下面提到, 
  93.         而后一个方法则是关闭一定时间空闲的连接,可以使用一个单独的线程完成这个工作。 
  94.      */  
  95.     private static void test10(){  
  96.           
  97. 版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
    原文链接:https://blog.csdn.net/u014704496/article/details/40863045
    站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
    • 发表于 2020-03-07 23:23:01
    • 阅读 ( 1398 )
    • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢