我在主机 A 上有一个客户端,使用 Apache HTTPClient (4.2.5) 向主机 B 上的服务器发布消息。在主机 A 上,我将连接和读取/套接字超时设置为(我认为是)推荐的时尚:
client = new DefaultHttpClient();
params = client.getParams();
HttpConnectionParams.setConnectionTimeout(params, 5000);
HttpConnectionParams.setSoTimeout(params, 20000);
我正在尝试测试客户端传输在传输了部分但不是全部数据流后突然终止(例如,主机 B 上的目标服务器崩溃)时的超时行为。因此,我的测试方法是:
- 从主机 A 上的客户端应用程序启动 HTTP POST。
- 在日志表明客户端已调用底层 Apache HTTPClient 框架后不久,在主机 B 上启用防火墙规则以阻止来自主机 A 的流量。
我可以确认(通过数据包捕获)测试实际上是在中途切断请求数据。
我本来希望客户端应用程序随后在读取超时间隔(20 秒)之后超时,但我看到的是客户端在最终遇到之前挂起更长的时间间隔(在 500-600 秒范围内)连接超时。
任何人都可以解释(或失败,冒险猜测)为什么客户忽略我指定的超时时间?在这种情况下,有什么方法可以强制超时吗?