连接和连接请求超时

mvb*_*b13 19 java http apache-httpcomponents apache-httpclient-4.x

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

dgi*_*nes 24

HttpClient有一种方法可以根据http://hc.apache.org/httpclient-3.x/apidocs/org/apache/commons/httpclient/HttpClient.html设置连接和套接字超时(setConnectionTimeout()setTimeout())

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

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

例:

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

  • 好的,我终于发现getConnectionRequestTimeout以从连接管理器请求连接时使用的毫秒数返回imeout.我猜连接管理器是apache-httpcomponents库类,所以我不会用它.我将使用setConnectionTimeout()和setTimeout(). (22认同)
  • 谢谢你的回复,但我还是有问题.这是请求配置构建器http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/client/config/RequestConfig.Builder.html,它有三个方法setConnectionRequestTimeout,setConnectTimeout ,setSocketTimeout(并没有评论!).所以我仍然不知道每个方法究竟是做什么以及我应该使用哪些方法. (7认同)
  • 在这种情况下,评论比答案更有帮助。 (4认同)
  • 答案并没有告诉我们连接请求超时是多少。必须检查评论。 (2认同)

Gra*_*ray 8

在HttpClient 4.XX中,以下是如何构建使用特定--connect-timeout seconds和的客户端--max-time seconds.

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();
...
Run Code Online (Sandbox Code Playgroud)

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


Raj*_*ani 8

从文档:

/**
 * Returns the timeout in milliseconds used when requesting a connection
 * from the connection manager. A timeout value of zero is interpreted
 * as an infinite timeout.
 * <p>
 * A timeout value of zero is interpreted as an infinite timeout.
 * A negative value is interpreted as undefined (system default).
 * </p>
 * <p>
 * Default: {@code -1}
 * </p>
 */
public int getConnectionRequestTimeout() {
    return connectionRequestTimeout;
}

/**
 * Determines the timeout in milliseconds until a connection is established.
 * A timeout value of zero is interpreted as an infinite timeout.
 * <p>
 * A timeout value of zero is interpreted as an infinite timeout.
 * A negative value is interpreted as undefined (system default).
 * </p>
 * <p>
 * Default: {@code -1}
 * </p>
 */
public int getConnectTimeout() {
    return connectTimeout;
}
Run Code Online (Sandbox Code Playgroud)

代码应该是这样的:

HttpClientBuilder clientBuilder = HttpClientBuilder.create();
RequestConfig.Builder requestBuilder = RequestConfig.custom();
// Connection Timeout to establish a connection
requestBuilder = requestBuilder.setConnectTimeout(connectTimeoutMillis);
// Timeout to get a connection from the connection manager for the Http Client
requestBuilder = requestBuilder.setConnectionRequestTimeout(requestTimeoutMillis);
// Timeout between two data packets from the server
requestBuilder = requestBuilder.setSocketTimeout(requestTimeoutMillis);
clientBuilder.setDefaultRequestConfig(requestBuilder.build());
CloseableHttpClient httpClient = clientBuilder.build();
Run Code Online (Sandbox Code Playgroud)