apache HttpClient API 中的 setConnectionTimeout 、setSoTimeout 和 “http.connection-manager.timeout” 有什么区别?

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

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"


答案 1

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

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

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

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


答案 2

此序列图可能会有所帮助。

apache http api


推荐