13

我目前正在尝试同时执行多个HttpGet请求CloseableHttpClient
我用谷歌搜索了如何做到这一点,答案是使用PoolingHttpClientConnectionManager.

在这一点上,我得到了这个:

PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
    .setConnectionManager(cManager)
    .build();

然后我尝试了一个HttpGet请求http://www.google.com,一切正常。

然后我通过 cmd 创建了一个信任库并导入了目标网站的证书,SSLConnectionSocketFactory使用我的信任库设置了一个并设置SSLSocketFactoryhttpClient

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream inputStream = new FileInputStream(new File("myTrustStore.truststore"));
trustStore.load(inputStream, "nopassword".toCharArray());
inputStream.close();

SSLContext sslContext = SSLContexts.custom().loadTrustMaterial(trustStore).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
    SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);

PoolingHttpClientConnectionManager cManager = new PoolingHttpClientConnectionManager();
CloseableHttpClient httpClient = HttpClients.custom()
    .setSSLSocketFactory(sslsf)
    .setConnectionManager(cManager)
    .build();

如果我尝试执行 Https,HttpGet则会出现PKIX path building failed异常。
如果我在没有.setConnectionManager(cManager)一切正常的情况下做同样的事情。

你们中的任何人都可以告诉我如何让它工作吗?(别担心,我没有创建任何 ddos​​ 工具)

提前致谢!

PS:我正在使用 HttpComponents 4.3.1

4

1 回答 1

33

找到了答案: https ://stackoverflow.com/a/19950935/1223253

只需要添加

Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create().register("https", sslsf).build();

socketFactoryRegistry作为参数传递给PoolingHttpClientConnectionManager. 现在它工作得很好:)

于 2013-12-11T08:28:34.977 回答