0

我在主机 A 上有一个客户端,使用 Apache HTTPClient (4.2.5) 向主机 B 上的服务器发布消息。在主机 A 上,我将连接和读取/套接字超时设置为(我认为是)推荐的时尚:

client = new DefaultHttpClient();
params = client.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 20000);

我正在尝试测试客户端传输在传输了部分但不是全部数据流后突然终止(例如,主机 B 上的目标服务器崩溃)时的超时行为。因此,我的测试方法是:

  1. 从主机 A 上的客户端应用程序启动 HTTP POST。
  2. 在日志表明客户端已调用底层 Apache HTTPClient 框架后不久,在主机 B 上启用防火墙规则以阻止来自主机 A 的流量。

我可以确认(通过数据包捕获)测试实际上是在中途切断请求数据。

我本来希望客户端应用程序随后在读取超时间隔(20 秒)之后超时,但我看到的是客户端在最终遇到之前挂起更长的时间间隔(在 500-600 秒范围内)连接超时

任何人都可以解释(或失败,冒险猜测)为什么客户忽略我指定的超时时间?在这种情况下,有什么方法可以强制超时吗?

4

2 回答 2

1

不知道为什么这不起作用,但您可以尝试另一种方法,在实例化 HttpClient 之前创建 Params 对象。

有这样的效果:

HttpParams 参数 = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 20000);
HttpClient httpClient = new DefaultHttpClient(params);

每个 http 消息还有一组唯一的参数,这些参数将覆盖客户端连接对象的设置。您可能想检查他们是否自己指定超时,从而使您设置的超时未使用(除非明确设置,否则不应发生,但值得检查) HttpMessage#getParam

此外,您可以尝试自己在 HttpGet 或 HttPost 对象上明确设置这些参数,看看是否会改变行为。

于 2013-08-09T22:28:01.753 回答
0

所以发生的情况是,超时属性适用于通过 DNS 解析获得的每个地址。例如 abc.come 解析为 4 个不同的 IP 地址,并且您设置了 10 秒的超时。因此,您的请求将在超时之前总共等待 4 x 10 = 40 秒。

于 2021-05-27T04:54:31.473 回答