httpclient4.5入门教程之连接管理

网络爬虫知识 day04 一、封装HttpClient 我们需要经常使用HttpClient,所以需要进行封装,方便使用 @Component public class HttpUtils { private PoolingHttpClientConnectionManager cm; public HttpUtils() { this.cm = new PoolingHttpClientConnectionManager(); // 设置最大连接数 ... 阅读详情

2.4.请求执行的多线程

当配备连接池管理器时,比如 PoolingClientConnectionManager, HttpClient 可以被用使用多线程来同时执行多个请求。

PoolingClientConnectionManager将会基于它的配置来分配连接。如果对于给定路由的所有连接都被使用了,那么连接的请求将会阻塞,直到一个连接被释放回连接池。 它
可以通过设置’http.conn-manager.timeout’为一个正数来保证连接管理器不会在连接请求执行时无限期的被阻塞。 如果连接请求不能在给定的时间内被响应,将会抛出
ConnectionPoolTimeoutException 异常。
  1. PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();  
  2. CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();  
  3. // URIs to perform GETs on  
  4. String[] urisToGet = {”http://www.domain1.com/”,“http://www.domain2.com/”,  
  5.                   ”http://www.domain3.com/”,“http://www.domain4.com/”};  
  6. // create a thread for each URI  
  7. GetThread[] threads = new GetThread[urisToGet.length];  
  8. for (int i = 0; i < threads.length; i++) {  
  9.     HttpGet httpget = new HttpGet(urisToGet[i]);  
  10.     threads[i] = new GetThread(httpClient, httpget);  
  11. }  
  12. // start the threads  
  13. for (int j = 0; j < threads.length; j++) {  
  14.     threads[j].start();  
  15. }  
  16. // join the threads  
  17. for (int j = 0; j < threads.length; j++) {  
  18.     threads[j].join();  
  19. }  
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
// URIs to perform GETs on
String[] urisToGet = {"http://www.domain1.com/","http://www.domain2.com/",
                  "http://www.domain3.com/","http://www.domain4.com/"};
// create a thread for each URI
GetThread[] threads = new GetThread[urisToGet.length];
for (int i = 0; i < threads.length; i++) {
    HttpGet httpget = new HttpGet(urisToGet[i]);
    threads[i] = new GetThread(httpClient, httpget);
}
// start the threads
for (int j = 0; j < threads.length; j++) {
    threads[j].start();
}
// join the threads
for (int j = 0; j < threads.length; j++) {
    threads[j].join();
}


一个HttpClient实例是线程安全的,并且能够在多个执行线程直接共享,强烈建议每个线程保持一个它自己专有的HttpContext实例。
  1. static class GetThread extends Thread {  
  2.   private final CloseableHttpClient httpClient;  
  3.   private final HttpContext context;  
  4.   private final HttpGet httpget;  
  5.   public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {  
  6.     this.httpClient = httpClient;  
  7.     this.context = HttpClientContext.create();  
  8.     this.httpget = httpget;  
  9.   }  
  10.   @Override  
  11.   public void run() {  
  12.     try {  
  13.       CloseableHttpResponse response = httpClient.execute( httpget, context);  
  14.       try {  
  15.         HttpEntity entity = response.getEntity();  
  16.       } finally {  
  17.         response.close();  
  18.       }  
  19.     } catch (ClientProtocolException ex) {  
  20.       // Handle protocol errors  
  21.     } catch (IOException ex) {  
  22.       // Handle I/O errors  
  23.     }  
  24.   }  
  25. }  
static class GetThread extends Thread {
  private final CloseableHttpClient httpClient;
  private final HttpContext context;
  private final HttpGet httpget;
  public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
    this.httpClient = httpClient;
    this.context = HttpClientContext.create();
    this.httpget = httpget;
  }
  @Override
  public void run() {
    try {
      CloseableHttpResponse response = httpClient.execute( httpget, context);
      try {
        HttpEntity entity = response.getEntity();
      } finally {
        response.close();
      }
    } catch (ClientProtocolException ex) {
      // Handle protocol errors
    } catch (IOException ex) {
      // Handle I/O errors
    }
  }
}


2.5.连接回收策略Connection eviction policy

一个典型阻塞 I/O 的模型的主要缺点是网络socket仅当 I/O 操作阻塞时才可以响应 I/O
事件。当一个连接被释放回管理器时,它可以被保持活动状态而却不能监控socket的状态
和响应任何 I/O 事件。 如果连接在服务器端关闭,那么客户端连接也不能去侦测连接状态中的变化(也不能关闭本端的socket去作出适当反馈)。


HttpClient 通过测试连接是否是连接是过时的来尝试去减轻这个问题。在服务器端关闭的连接已经不再有效了,优先使用之前使用执行 HTTP 请求的连接。过时的连接检查也并不是100%可靠。唯一可行的而不涉及每个空闲连接的socket模型线程的解决方案是:是使用专用的监控线程来收回因为长时间不活动而被认 为 是 过 期 的 连 接 。 监 控 线 程 可 以 周 期 地 调 用ClientConnectionManager#closeExpiredConnections()方法来关闭所有过期 的 连 接 并且从 连 接 池 中 收 回 关 闭 的 连 接 。 它 也 可 以 选 择 性 调 用ClientConnectionManager#closeIdleConnections()方法来关闭所有已经空
闲超过给定时间周期的连接。
  1. public static class IdleConnectionMonitorThread extends Thread {  
  2.   private final HttpClientConnectionManager connMgr;  
  3.   private volatile boolean shutdown;  
  4.   public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr) {  
  5.     super();  
  6.     this.connMgr = connMgr;  
  7.   }  
  8.   @Override  
  9.   public void run() {  
  10.     try {  
  11.       while (!shutdown) {  
  12.         synchronized (this) {  
  13.         wait(5000);  
  14.         // Close expired connections  
  15.         connMgr.closeExpiredConnections();  
  16.         // Optionally, close connections  
  17.         // that have been idle longer than 30 sec  
  18.         connMgr.closeIdleConnections(30, TimeUnit.SECONDS);  
  19.       }  
  20.      }  
  21.     } catch (InterruptedException ex) {  
  22.      // terminate  
  23.     }  
  24.   }  
  25.   public void shutdown() {  
  26.     shutdown = true;  
  27.     synchronized (this) {  
  28.       notifyAll();  
  29.     }  
  30.   }  
  31. }  
public static class IdleConnectionMonitorThread extends Thread {
  private final HttpClientConnectionManager connMgr;
  private volatile boolean shutdown;
  public IdleConnectionMonitorThread(HttpClientConnectionManager connMgr) {
    super();
    this.connMgr = connMgr;
  }
  @Override
  public void run() {
    try {
      while (!shutdown) {
        synchronized (this) {
        wait(5000);
        // Close expired connections
        connMgr.closeExpiredConnections();
        // Optionally, close connections
        // that have been idle longer than 30 sec
        connMgr.closeIdleConnections(30, TimeUnit.SECONDS);
      }
     }
    } catch (InterruptedException ex) {
     // terminate
    }
  }
  public void shutdown() {
    shutdown = true;
    synchronized (this) {
      notifyAll();
    }
  }
}



2.6.连接保持策略

HTTP 规范没有详细说明一个持久连接可能或应该保持活动多长时间。一些 HTTP 服务器使用非标准的首部Keep-Alive来告诉客户端它们想在服务器端保持连接活动的周期秒数。如果这个信息存在, HttClient 就会使用它。如果响应中首部Keep-Alive 在不存在, HttpClient会假定无限期地保持连接。然而许多 HTTP 服务器的普遍配置是在特定非
活动周期之后丢掉持久连接来保护系统资源,往往这是不通知客户端的。默认的策略是过于乐观的,你必须提供一个自定义的keep-alive策略


  1. ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {  
  2.     public long getKeepAliveDuration(HttpResponse response, HttpContext context) {  
  3.         // Honor ‘keep-alive’ header  
  4.         HeaderElementIterator it = new BasicHeaderElementIterator(  
  5.             response.headerIterator(HTTP.CONN_KEEP_ALIVE));  
  6.         while (it.hasNext()) {  
  7.             HeaderElement he = it.nextElement();  
  8.             String param = he.getName();  
  9.             String value = he.getValue();  
  10.             if (value != null && param.equalsIgnoreCase(“timeout”)) {  
  11.                 try {  
  12.                     return Long.parseLong(value) * 1000;  
  13.                 } catch(NumberFormatException ignore) {  
  14.                 }  
  15.             }  
  16.         }  
  17.         HttpHost target = (HttpHost) context.getAttribute(  
  18.                     HttpClientContext.HTTP_TARGET_HOST);  
  19.         if (“www.naughty-server.com”.equalsIgnoreCase(target.getHostName())) {  
  20.             // Keep alive for 5 seconds only  
  21.             return 5 * 1000;  
  22.         } else {  
  23.             // otherwise keep alive for 30 seconds  
  24.             return 30 * 1000;  
  25.         }  
  26.     }  
  27. };  
  28. CloseableHttpClient client = HttpClients.custom().setKeepAliveStrategy(myStrategy).build();  
ConnectionKeepAliveStrategy myStrategy = new ConnectionKeepAliveStrategy() {
    public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
        // Honor 'keep-alive' header
        HeaderElementIterator it = new BasicHeaderElementIterator(
            response.headerIterator(HTTP.CONN_KEEP_ALIVE));
        while (it.hasNext()) {
            HeaderElement he = it.nextElement();
            String param = he.getName();
            String value = he.getValue();
            if (value != null && param.equalsIgnoreCase("timeout")) {
                try {
                    return Long.parseLong(value) * 1000;
                } catch(NumberFormatException ignore) {
                }
            }
        }
        HttpHost target = (HttpHost) context.getAttribute(
                    HttpClientContext.HTTP_TARGET_HOST);
        if ("www.naughty-server.com".equalsIgnoreCase(target.getHostName())) {
            // Keep alive for 5 seconds only
            return 5 * 1000;
        } else {
            // otherwise keep alive for 30 seconds
            return 30 * 1000;
        }
    }
};
CloseableHttpClient client = HttpClients.custom().setKeepAliveStrategy(myStrategy).build();



2.7.连接socket工厂

HTTP连接内部使用java.net.Socket 来通过网线处理传输数据。可是,他们依靠ConnectionSocketFactory接口来创建、初始化和连接socket。HttpClient为使用者提供了在程序运行时明确的socket初始化代码。PlainConnectionSocketFactory是创建,初始化普通的socket(非加密socket)的工厂。


socket的创建过程和把它连接到一个主机上的过程是非对称的 。所以当被连接操作阻塞时socket将会关闭。

  1. HttpClientContext clientContext = HttpClientContext.create();  
  2. PlainConnectionSocketFactory sf = PlainConnectionSocketFactory.getSocketFactory();  
  3. Socket socket = sf.createSocket(clientContext);  
  4. int timeout = 1000; //ms  
  5. HttpHost target = new HttpHost(“localhost”);  
  6. InetSocketAddress remoteAddress =   
  7.       new InetSocketAddress(netAddress.getByAddress(new byte[] {127,0,0,1}), 80);  
  8. sf.connectSocket(timeout, socket, target, remoteAddress, null, clientContext);  
HttpClientContext clientContext = HttpClientContext.create();
PlainConnectionSocketFactory sf = PlainConnectionSocketFactory.getSocketFactory();
Socket socket = sf.createSocket(clientContext);
int timeout = 1000; //ms
HttpHost target = new HttpHost("localhost");
InetSocketAddress remoteAddress = 
      new InetSocketAddress(netAddress.getByAddress(new byte[] {127,0,0,1}), 80);
sf.connectSocket(timeout, socket, target, remoteAddress, null, clientContext);


2.7.1.安全套接字分层

LayeredConnectionSocketFactory是ConnectionSocketFactory接口的拓展。分层的socket工厂可以创建在已经存在的普通socket之上。套接字分层主要通过代理来创建安全的socket。 HttpClient装载实现了 SSL/TLS 分层的 SSLSocketFactory。 请注意 HttpClient 不使用任
何自定义加密功能。它完全依赖于标准的Java Cryptography(JCE)和Secure Sockets(JSEE)扩展。

2.7.2.与连接管理器整合

自定义的连接socket工厂与一个被称为HTTP或HTTPS的特定协议模式有关,它被用来创建自定义连接管理器
  1. ConnectionSocketFactory plainsf = <…>  
  2. LayeredConnectionSocketFactory sslsf = <…>  
  3. Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create()  
  4.     .register(”http”, plainsf).register(“https”, sslsf).build();  
  5. HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);  
  6. HttpClients.custom().setConnectionManager(cm).build();  
ConnectionSocketFactory plainsf = <...>
LayeredConnectionSocketFactory sslsf = <...>
Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory>create()
    .register("http", plainsf).register("https", sslsf).build();
HttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);
HttpClients.custom().setConnectionManager(cm).build();



2.7.3.定制SSL/TLS

HttpClient 使用 SSLSocketFactory来创建 SSL连接。SSLSocketFactory允许高度定制。它可以使用 javax.net.ssl.SSLContext 的实例作为参数, 并使用它来创建能够自定义配置的 SSL连接。
  1. KeyStore myTrustStore = <…>  
  2. SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(myTrustStore).build();  
  3. SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);  
KeyStore myTrustStore = <...>
SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(myTrustStore).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);


SSLSocketFactory的定制意味着对SSL/TLS协议概念有一定的熟悉,详细说明它超出
了本文档的范围。请参考Java™Secure Socket Extension(JSSE) 参考指南[http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html],从而获得javax.net.ssl.SSLContext的详细描述和相关工具。

2.7.4.主机名核实

为了信任证明并且客户端的表现在SSL/TLS级别上,HttpClient随意的核实是否目标主机名匹配储存在X.509服务器上的证书。一旦连接被建立,这个证明能提供服务器信任材料额外的保证。javax.net.ssl.HostnameVerifier接口代表了主机名验证的策略。 HttpClient有两个
javax.net.ssl.HostnameVerifier的实现。重点:主机名验证不应该和SSL信任验证混淆。


·DefaultHostnameVerifier:遵从RFC 2818规范,被HttpClient默认实现。主机名必须根据规定的证书匹配被几个可选择名字,如果没有合适的名字,将会给出最具体的证书CN 。一个通配符可能会出现在CN中和任何可选择的地方。
【he default implementation used by HttpClient is expected to becompliant with RFC 2818. The hostname must match any of alternative names specified by thecertificate, or in case no alternative names are given the most specific CN of the certificate subject.A wildcard can occur in the CN, and in any of the subject-alts.】

·NoopHostnameVerifier:主机名验证器根本就关掉了主机名验证。他接受任何合法的SSL会话,并且匹配目标主机

每次HttpClient默认使用DefaultHostnameVerifier实现。如果必要的话,你可以制定一个不同的主机名认证器实现。
  1. SSLContext sslContext = SSLContexts.createSystemDefault();  
  2. SSLConnectionSocketFactory sslsf =   
  3.        new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);  
SSLContext sslContext = SSLContexts.createSystemDefault();
SSLConnectionSocketFactory sslsf = 
       new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);


在HttpClient 4.4 版本,使用被Mozilla Foundation维护的公共的后缀列表,确保SSL证书中的通配符不能够被滥用来在顶级域名下启用多个域名。HttpClient在发布时复制了一份列表。
最新的版本列表能够在https://publicsuffix.org/list/ [https://publicsuffix.org/list/
effective_tld_names.dat]找到。强烈建议下载一份列表,防止在每天使用时访问原始位置。

  1. PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(  
  2.     PublicSuffixMatcher.class.getResource(“my-copy-effective_tld_names.dat”));  
  3. DefaultHostnameVerifier hostnameVerifier = new   
  4.                              DefaultHostnameVerifier (publicSuffixMatcher)  
PublicSuffixMatcher publicSuffixMatcher = PublicSuffixMatcherLoader.load(
    PublicSuffixMatcher.class.getResource("my-copy-effective_tld_names.dat"));
DefaultHostnameVerifier hostnameVerifier = new 
                             DefaultHostnameVerifier (publicSuffixMatcher)



2.8.HttpClient代理配置

尽管HttpClient了解复杂的路由模式和路由链,但它只支持简单的重定向或者一跳代理连接。
告诉HttpClient通过代理连接目标服务器最简单的方式是设置默认的代理参数
HttpHost proxy = new HttpHost(“someproxy”, 8080);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner) .build();


你也可以使用标准的JRE代理选择器通知HttpClient来获得代理信息
  1. SystemDefaultRoutePlanner routePlanner =   
  2.                        new SystemDefaultRoutePlanner(ProxySelector.getDefault());  
  3. CloseableHttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner) build();  
SystemDefaultRoutePlanner routePlanner = 
                       new SystemDefaultRoutePlanner(ProxySelector.getDefault());
CloseableHttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner) build();


你也可以实现一个自定义的RoutePlanner,来实现一个在完整控制HTTP路由计算的处理器。
  1. HttpRoutePlanner routePlanner = new HttpRoutePlanner() {  
  2.   public HttpRoute determineRoute( HttpHost target, HttpRequest request,  
  3.                                  HttpContext context) throws HttpException {  
  4.     return new HttpRoute(target, null, new HttpHost(“someproxy”, 8080),  
  5.           ”https”.equalsIgnoreCase(target.getSchemeName()));  
  6.   }  
  7. };  
  8. CloseableHttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner).build();  
HttpRoutePlanner routePlanner = new HttpRoutePlanner() {
  public HttpRoute determineRoute( HttpHost target, HttpRequest request,
                                 HttpContext context) throws HttpException {
    return new HttpRoute(target, null, new HttpHost("someproxy", 8080),
          "https".equalsIgnoreCase(target.getSchemeName()));
  }
};
CloseableHttpClient httpclient = HttpClients.custom() .setRoutePlanner(routePlanner).build();





RestTemplate介绍使用,以及整合 HttpClient 连接池 配置长连接 1、RestTemplate介绍 spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,我们只需要传入url及返回值类型即可。相较于之前常用的httpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。 RestTempla... 阅读详情

相关推荐

Java爬虫系列一:HttpClient请求工具,IP代理模式

IP代理模式顾名思义,使用非本机IP来请求目标数据,两大好处: 1.作为爬虫项目,有效防止IP风控 2.不多说,你懂得~ 特此声明:本人所有文章都只供大家学习,任何个人或组织不得直接或间接使用本文所有文章中的技术内容干违背国家法律规定的业务。如因此造成的一切后果本人概不承担。 另附《中华人民共和国网络安全法》大家以此为底线,一定要保持职业操守,做合法社会主义好公民 废话不多,直接上源码。 1.Maven依赖 <dependency> <groupId>org.a

大鹏-coder的博客 2344

【HttpClient4.5中文教程】十.HttpClient连接管理2

4.请求执行的多线程当配备连接池管理器时,比如 PoolingClientConnectionManager, HttpClient 可以被用使用多线程来同时执行多个请求。PoolingClientConnectionManager将会基于它的配置来分配连接。如果对于给定路由的所有连接都被使用了,那么连接的请求将会阻塞,直到一个连接被释放回连接池。 它可以通过设置'http.conn-manage

要啥自行车 5952

Httpclient4.5详解之源码解析和使用二: 连接池内连接的创建 借出 归还

Httpclient4.5详解之源码解析和使用一: 关键执行流程源码解读 承接上文,本文我们查看httpcommons连接池的源码来分析一下连接池将连接缓存起来然后借出的归还的,其中建立的socket连接是如何关闭的,现在我们就通过源码来一看究竟。 创建和借出 上文源码分析流程提到,具体流程会执行到InternalHttpClient#doExecute和execChain#execu...

派大星的博客 2502

HttpClient高级进阶-ConnectionManager

简述 本文介绍HttpClient的连接管理,主要介绍使用BasichttpClientConnectionManager和PoolingHttpClientConnectionManager来实现强制安全,协议兼容和有效使用HTTP连接。 用于单线程连接的BasicHttpClientConnectionManager 自HttpClient 4.3.3起,BasicHttpClientConnectionManager可用作HTTP连接管理器的最简单实现。它用于创建和管理一次只能由一个线程使用的单

GTH07399的博客 3596

httpclient4.5 的 httpclient对象是可以作为单例复用的吗?

Apache HttpClient 4.5 的 `HttpClient` 对象可以作为单例复用,且这是官方推荐的最佳实践

岁月静好 1177

Apache HttpClient 5.x 版本中的连接管理

在Apache HttpClient 4.5版本中,推荐使用来监控和清理连接池中的空闲连接。该线程会定期调用和方法,确保连接池的健康状态,避免连接长时间空闲导致的资源浪费。wait(5000);// 终止线程。

2501_90323865的博客 384

【HttpClient】HttpClient4.5基础教程

一、前言 1、说明 HttpClient是一个目前最常用的用于模拟客户端发送http请求的工具,可用于接口自动化测试或者爬虫或者在项目中加入获取其他网站数据等; 支持目前所有的请求方式,如put,post,get,delete等; 2、maven依赖添加 maven依赖如下: &amp;amp;amp;lt;dependency&amp;amp;amp;gt; &amp;amp;amp;lt;groupId&amp;amp;amp;gt;org.apache.ht

df0128的专栏 1万+

电感损耗 DCR/ACR/磁芯损耗 3 大来源解析:从集肤效应到磁滞回线

本文深入解析电感损耗的三大来源:DCR(直流电阻)、ACR(交流电阻)和磁芯损耗,从集肤效应到磁滞回线的微观机制。通过对比不同材料和设计策略,提供高频开关电源中电感损耗的优化方案,帮助工程师提升系统效率和可靠性。

weixin_34379433的博客 516

httpClient 4.5.2 实现连接池

如下代码public class PoolHttpsClientService {     // 日志     private static final SimpleLogger LOGGER = SimpleLogger.getLogger(PoolHttpsClientService.class);     private static final String CHAR_SET =

qian119110的专栏 8305

振动信号相位测量的关键技术解析

本文深入解析了振动信号相位测量的关键技术,强调相位是振动信号的“身份证”,对于动平衡和故障诊断至关重要。文章详细阐述了键相传感器与振动传感器的选型、安装要点,以及时域和频域(FFT)核心算法,并针对现场噪声、转速波动等挑战提供了实战解决方案,帮助工程师实现精准、稳定的相位测量。

vv45678的博客 839

保姆级教程:在Ubuntu 22.04上从零安装SUMO并运行第一个交通仿真

本教程详细介绍了在Ubuntu 22.04系统上从零安装SUMO交通仿真软件并运行第一个仿真的完整流程。涵盖环境准备、PPA源安装、核心组件验证、首次仿真案例运行以及进阶配置技巧,特别针对netedit路网编辑器和地图格式转换等实用工具进行重点讲解,帮助用户快速掌握SUMO在交通仿真领域的应用。

weixin_30546189的博客 424

HttpClient连接池管理

HTTP连接管理器 管理连接和连接管理器 Http连接是复杂,有状态的,线程不安全的对象,所以它必须被妥善管理。一个Http连接在同一时间只能被一个线程访问。HttpClient使用一个叫做Http连接管理器的特殊实体类来管理Http连接,这个实体类要实现HttpClientConnectionManager接口。Http连接管理器在新建http连接时,作为工厂类;管理持久http连接的生命周...

keylihai的博客 1581

AWR1843+DCA1000通过mmwave studio采集数据遇到的问题及解决方法

确保DCA1000的拨钮拨在了RADAR_5V_IN一边,这代表DCA1000通过与其相连的雷达板子供电,如果拨到了DC_JACK5V_IN一边,表示DCA1000用单独的电源供电。

qq_50974341的博客 4165

HttpClient的使用与连接资源释放

文章目录HttpClient一、请求类型二、使用依赖三、参考文档四、使用4.1 获取`httpClient`4.2 相关配置4.2.1 HttpClientConnectionManager4.2.2 RequestConfig4.3 使用示例:GET五、问题探讨5.1 关闭5.2 不关闭5.3 response问题:消费不彻底问题:消费彻底问题:关闭资源5.4 httpClient5.4.1 httpClient.close5.4.2 如何高效获取和使用httpClient1. 使用时生成2.连接池获取3

qq_43429919的博客 9948

【XSRP软件无线电】基于软件无线电平台的QPSK频带通信系统设计(含有完整工程资料获取链接)

软件无线电(Software Defined Radio, SDR)是一种无线通信系统,它通过软件来定义和实现无线电的功能,而不是依赖于传统的硬件电路。SDR平台的核心思想是将传统无线电系统中的大部分硬件功能,如调制解调、信号处理、频率选择等,通过软件来实现。这种设计理念使得SDR具有高度的灵活性和可重配置性,能够适应不同的通信标准和频段,快速适应新的通信技术。

嵌入式技术开发 3286

windows exe爬虫:exe抓包

在不知情所拦截应用使用的流量时,所以建议用Wireshark。本文利用python代码,实现自动拦截,写入pcap包,并用代码分析流量的协议。这样会在本地目录下生成capture_inbound.pcap,可以用wireshark分析,也可以利用python代码进行分析,如果使用python代码进行分析,需要借助pyshark或者scapy。使用的python WinDivert的包,当然前提也是需要安装Wireshark软件,设置环境变量,并安装pydirvert包。

youbingchen的博客 619

HttpClient4.X 升级 入门 + http连接池使用

转载请注明出处,谢谢~ http://blog.csdn.net/shootyou/archive/2011/05/12/6415248.aspx   在一次服务器异常的排查过程当中(服务器异常排查的过程我会另起文章),我们决定使用HttpClient4.X替代HttpClient3.X或者HttpConnection。 为什么使用HttpClient4?主要是HttpConnection

C My Life 7万+

【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)

ShaderGraph是Unity中的一个可视化工具,用于创建和编辑图形着色器。其意义在于简化编写复杂着色器的过程,减少对具体编程语言的依赖,使艺术家和设计师可以更方便地创建各种美术效果。使用ShaderGraph可以通过图形界面设置着色器属性,包括颜色、纹理、光照等,并在视窗预览中即时显示结果,从而快速迭代和调整着色器。使用ShaderGraph需要先安装Unity 2018.1或以上版本,并添加ShaderGraph插件。打开ShaderGraph面板后,可以通过拖放节点并连接它们来创建着色器。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4万+

基于HttpClient4.5实现网络爬虫

这里做一个简短的说明,之前在博客《基于HttpClient实现网络爬虫~以百度新闻为例》介绍了如何基于HttpClient3.0来模拟浏览器请求,但从4.0版本之后,Apache就对这个包做了很大的改动,这里就针对目前比较新的版本4.5再来介绍下如何模拟浏览器的请求

小鸡慢慢的专栏 7332

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

http 连接池 java_HttpClient 连接池管理

随着微服务的流行,服务之间的http调用越来越多。在java里面我们可以使用httpclient这个开源工具类来进行处理,但若使用不当,可能性能会比较差,尤其是连接池是否能正常使用。接下来会详细分析下httpclient的连接池原理。1. 使用httpclient的好处1)、降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手...

weixin_32126555的博客 2556

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HttpClient 4.5 Best Practice

最近在封装http请求相关的library,希望接口的行为和实现分离,这样底层library再切换不同http请求实现 例如:Apache HttpClient、OkHttp、AsyncHttpClient 等不影响上层调用行为。介绍HttpClient 4.5 Tutorial主要分为:基础(Fundamentals)、连接管理(Connection management)、http状态管理(HT

Ricky 3498

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

httpClient4.5创建连接池进行post请求

httpClient4.5 创建线程池进行post请求

先森怪兽赵丶 8221

Http 持久连接与 HttpClient 连接池

你知道的越多,不知道的就越多,业余的像一棵小草!成功路上并不拥挤,因为坚持的人不多。编辑:业余草cnblogs.com/kingszelda/p/8988505.html推荐:https:...

xmt1139057136的专栏 2251

httpclient4.5如何确保资源释放

更新:releaseConnection()这个方法已经不再推荐了,我用的httpclient4.5的jar包,不需要对request进行这个操作了,看官方文档解释是更换了连接池管理类,最新的是:PoolingHttpClientConnectionManager。 在请求失败的时候respo...

1667

通过java连接kvstore连接池,Java,HttpClient4.5,https及使用连接池

技术环境:idea2019 + maven3.6 + Java8 + httpclient4.5连接池参数说明:maxTotal,最大连接数===>连接池里的最大连接数;connectTimeout,连接超时==>指客户端和服务器建立连接的timeout;socketTimeout,读超时===>客户端和服务器建立连接后,客户端从服务器读取数据的timeout,超出后会抛出Soc...

weixin_29883867的博客 618
上一篇: 【HttpClient4.5中文教程】【第一章 :基础】1.3 HttpClient执行上下文
下一篇: json-path的实例教程
光与热
博客等级 码龄11年 55粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值