连接和连接请求超时

问题描述 投票:18回答:2

我正在使用Http Apache Components来执行http交互。我需要调整我的http客户端。为此,我有两个参数:连接超时和连接请求超时。在库文档和源代码中(没有找到评论)我没有找到这个术语的定义。我需要知道它们究竟意味着什么。可能是他们在HTTP协议文档中定义但我找不到它。所以,我的问题是这两个术语是什么意思以及它们如何彼此区分。

java http apache-httpclient-4.x apache-httpcomponents
2个回答
23
投票

HttpClient有一种方法可以根据setConnectionTimeout()设置连接和套接字超时(setTimeout()HttpClient javadocs)。

Connection timeout是在建立与服务器的连接之前的超时。

Socket timeout是接收数据的超时(套接字超时)。

例:

假设您指向浏览器访问网页。如果服务器在X秒内没有响起,则会发生连接超时。但如果它建立了连接,那么服务器将开始处理浏览器的结果。如果它在Y秒内没有结束此处理,则将发生套接字超时。


8
投票

所以,我的问题是[connection-timeout和connection-request-timeout]是什么意思以及它们如何相互区别。

连接超时是服务器接受请求之前的超时(以毫秒为单位)。如果指定3000,则http-client将等待3秒钟以使服务器在超时之前接受TCP连接。这通常用于确保您没有网络问题或者您正在联系正确的主机名或地址。这相当于curl的--connect-timeout seconds选项。

Connection-request-timeout是建立连接后的输入/输出超时。如果将此值指定为10000,则在http-client连接到服务器并发送请求后,它将等待10秒钟以使服务器返回结果。这通常用于确保您的作业不会永远等待慢速服务器。这相当于curl的--max-time seconds选项。

在HttpClient 4.X.X中,以下是如何构建使用特定connectTimeoutMillisrequestTimeoutMillis的客户端。

HttpClientBuilder clientBuilder = HttpClientBuilder.create();
RequestConfig.Builder requestBuilder = RequestConfig.custom();
requestBuilder = requestBuilder.setConnectTimeout(connectTimeoutMillis);
requestBuilder = requestBuilder.setConnectionRequestTimeout(requestTimeoutMillis);
clientBuilder.setDefaultRequestConfig(requestBuilder.build());
CloseableHttpClient httpClient = clientBuilder.build();
...

顺便说一句,这个代码的javadoc很糟糕。尝试手动弄清楚如何使用配置构建器。哇靠。

© www.soinside.com 2019 - 2024. All rights reserved.