不使用代理的超时
我从本地启动netcat的方法如下,该方法基本上侦听端口9090上的连接:
netcat -l -p 9090
然后使用Apache HttpComponents创建一个连接,连接超时为4秒。
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(4000)
.setConnectTimeout(4000)
.setConnectionRequestTimeout(4000)
.build();
HttpGet httpget = new HttpGet("http://127.0.0.1:9090");
httpget.setConfig(requestConfig);
try (CloseableHttpResponse response = HttpClients.createDefault().execute(httpget)) {}
在终端中(我正在运行netcat
),我看到了:
??]?D???;#???9?Mۡ?NR?w?{)?V?$?(=?&?*kj?
?5??98?#?'<?%?)g@? ?/??32?,?+?0??.?2???/??-?1???D
<!-- 4 seconds later -->
read(net): Connection reset by peer
在客户端,我看到的是:
Exception in thread "main" org.apache.http.conn.ConnectTimeoutException:
Connect to 127.0.0.1:9090 [/127.0.0.1] failed: Read timed out
这都是预期的。
使用代理超时
我会根据文档here略微更改客户端代码并配置代理。
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(4000)
.setConnectTimeout(4000)
.setConnectionRequestTimeout(4000)
.build();
HttpHost proxy = new HttpHost("127.0.0.1", 9090);
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(proxy);
CloseableHttpClient httpclient = HttpClients.custom()
.setRoutePlanner(routePlanner)
.build();
HttpGet httpget = new HttpGet("https://127.0.0.1:9090");
httpget.setConfig(requestConfig);
try (CloseableHttpResponse response = httpclient.execute(httpget)) {}
再次启动netcat,这次是在服务器端
CONNECT 127.0.0.1:9090 HTTP/1.1
Host: 127.0.0.1:9090
User-Agent: Apache-HttpClient/4.4.1 (Java/1.8.0_212)
但是CONNECT
超时不起作用。我只是永远地等待..
如何将httpclient
配置为超时4秒钟,就像我描述的第一种情况一样?
答案 0 :(得分:0)
一种可能性:
Initialized new generator.
1
2
3
4
None
Initialized new generator.
1
2
3
4
None
但是我愿意接受其他建议。
答案 1 :(得分:0)
RequestConfig
仅在通过特定路由与目标的连接完全建立后才生效。它们不适用于SSL握手或在交换主消息之前发生的任何CONNECT请求。
在ConnectionManager
级别配置套接字超时,以确保在一段时间不活动后连接级别的操作超时。