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

标签 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 秒超时设置的位置以及为什么不遵守我自己的超时有什么想法吗?

最佳答案

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

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

关于android - 一些 Android 客户端断开连接,然后在 15 秒后重试 HTTP 请求,即使超时时间更长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15537736/

相关文章:

android - 在android中使用计时器自动滚动水平列表项

android - Inkfilepicker Android 库中的错误

android - AppCompat 的 AccountAuthenticatorActivity

java - 运行 com.google.example.games.bc 失败

php - 如何在 PHP 中将 HTTP 请求中的所有信息打印到屏幕

vb.net - 单击电子邮件中的链接时如何避免启动浏览器

java - Java SE 和 Java EE 应用程序之间的通信

android - 更改声音文件的音调并保存到mp3文件

javascript - 如何用javascript引用https

http - http 响应中没有 Cache-Control header 的 ETag