42

三者有什么区别(标注为注释):

MultiThreadedHttpConnectionManager connManag =  new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams managParams = connManag.getParams();

managParams.setConnectionTimeout(connectiontimeout); // 1
managParams.setSoTimeout(sotimeout); //2

HttpMethodBase baseMethod = null;

try {
  HttpClient client = new HttpClient(connManag);
  client.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //3

  baseMethod = new GetMethod(…);
  int statusCode = client.executeMethod(…);

  …
}
catch (ConnectTimeoutException cte ){
  //Took too long to connect to remote host
}
catch (SocketTimeoutException ste){
  //Remote host didn’t respond in time
}
catch (Exception se){
  //Some other error occurred
}
finally {
  if (baseMethod != null)
    baseMethod.releaseConnection();
}

1. setConnectionTimeout- 如果它确定超时直到建立连接。

2. setSoTimeout- 如果它确定两个连续数据包之间的不活动时间或时间差,

那么下面的做什么:

3. "http.connection-manager.timeout"

4

4 回答 4

66

最低级别的 HTTP 是 TCP 套接字。因此,当您请求 URL 并获得响应时,在较低级别会创建一个客户端 Socket,它与远程服务器 Socket 建立连接,发送一些数据并接收响应。

  • setConnectionTimeout:客户端尝试连接到服务器。这表示在建立连接或服务器响应连接请求之前经过的时间。

  • setSoTimeout:建立连接后,客户端套接字发送请求后等待响应。这是从客户端在服务器响应之前向服务器发送请求以来经过的时间。请注意,这HTTP Error 408与服务器发送给客户端的内容不同。换句话说,它在连接建立后到达客户端的两个连续数据包之间 的最大周期不活动。

  • http.connection-manager.timeoutMultiThreadedHttpConnectionManager使用HTTP 连接池。它为每个主机设置了最大值和最小值。如果特定主机的所有连接都已达到最大值,则对同一主机的新连接请求将不得不等到现有连接中的任何一个空闲。此参数表示从发出连接请求到HttpConnectionManager返回连接之前经过的时间。

于 2013-08-12T11:14:13.100 回答
36

This sequence diagram might help.

apache http api

于 2018-02-15T21:12:50.807 回答
7

Apache HTTP 客户端站点的连接管理文档中提供了详细说明。

CoreConnectionPNames.SO_TIMEOUT='http.socket.timeout': 以毫秒为单位定义套接字超时(SO_TIMEOUT),这是等待数据的超时时间,或者换句话说,两个连续数据包之间的最大不活动时间)。超时值为零被解释为无限超时。此参数需要 java.lang.Integer 类型的值。如果未设置此参数,则读取操作不会超时(无限超时)。

CoreConnectionPNames.CONNECTION_TIMEOUT='http.connection.timeout': 确定建立连接之前的超时时间(以毫秒为单位)。超时值为零被解释为无限超时。此参数需要 java.lang.Integer 类型的值。如果未设置此参数,则连接操作不会超时(无限超时)。

连接管理器超时 (http.connection-manager.timeout) – 等待来自连接管理器/池的连接的时间

只是为了记录

HttpParams httpParams = httpClient.getParams();
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);

是另一种方法

HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000);
HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000);
于 2014-09-27T09:43:46.020 回答
2

简单来说:

  • 连接超时:您的应用程序在尝试与服务器建立连接并且无法建立连接时等待的时间限制(地址错误,或者服务器已关闭等...)
  • 套接字超时:您的应用程序在连接到服务器后等待响应但仍等待响应的时间限制(例如,延迟可能是由于服务器挂起引起的)
  • 连接管理器超时:一个请求在队列中等待池中的一个请求被释放时等待的时间限制。换句话说,在 HTTP 中,我们有一个最大大小的连接池。当应用程序有负载时,池可能已满,任何新请求都必须等待池中的另一个请求完成。
于 2018-02-14T11:20:32.940 回答