一些Android客户端断开连接,然后在15秒后重试HTTP请求,即使超时更大

时间:2013-03-21 01:10:22

标签: android http

我有一个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秒超时的设置以及为什么我的自己的超时不被尊重的任何想法?

1 个答案:

答案 0 :(得分:0)

我自己有这个问题,在查看this问题后,我能够用最佳答案解决这个问题。更改后,您的请求将如下所示:

...
URL url = new URL("my.server.com" + paramString);
System.setProperty("http.keepAlive", "false");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
...