我有一个 Android 应用程序向我控制的服务器发出 HTTP 请求。该服务器将请求中继到另一台服务器,我无法控制该服务器,并且当前严重超载。为了应对远程服务器的延迟,我增加了我知道的所有超时。
在我自己的服务器中,我看到一些客户端(Android 应用程序)在 15 秒后中止 HTTP 请求,然后重试相同的请求,即使我已将连接和读取超时设置得比这大得多。
我服务器中的 nginx 在日志中报告为 499 错误,并且它总是在请求到达后 15 秒左右发生。
在我的服务器上使用wireshark,我已经确认它是客户端断开连接(发送一个FIN数据包),然后立即重试相同的请求。
我无法使用自己的手机重现该问题。即使我让服务器引入人为延迟,我的手机也会遵守我设置的超时。在最近的一次更新中,我开始发送有关用户的一些基本信息(手机型号、Android 版本、当前连接类型),以查看是否可以检测到有问题手机的模式,但到目前为止还没有发现任何模式。
我之前HttpClient
在应用程序上使用过,并尝试了几种方法来纠正这个问题,但超时和重试一直在发生。然后我切换到HttpURLConnection
,我看到了同样的行为。代码的HttpURLConnection
版本非常简单,几乎从示例中逐字逐句,除了不同的超时值:
InputStream is = null;
try
{
URL url = new URL("my.server.com" + paramString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(180 * 1000);
conn.setConnectTimeout(30 * 1000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
int response = conn.getResponseCode();
is = conn.getInputStream();
}
我在文档中的任何地方都没有提到这种行为。关于这个 15 秒超时设置的位置以及为什么我自己的超时不被尊重的任何想法?