【问题标题】:Android intermittent SSL Socket read timed outAndroid 间歇性 SSL Socket 读取超时
【发布时间】:2016-01-31 21:37:17
【问题描述】:

我正在构建一个调用 HTTP/REST api 的 Android 应用程序。 我已经自签了一份测试证书并将其添加到我的手机信任库中。

我遇到了一个非常奇怪的问题,我会收到以下异常:

java.net.SocketTimeoutException: Read timed out
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:705)
...

我完全不知道这是如何发生的,或者为什么会发生。 重要说明:

  • 这是随机发生的,在多次请求后会返回,但有时会消失一两天。
  • 我无法可靠地重现该问题。
  • 我调整了超时设置,但没有结果。
  • 问题超出了应用程序的生命周期。重新启动应用程序没有任何效果,尽管它似乎在 5 分钟内自行解决。
  • 如果我使用的是 cookie 存储,删除它似乎可以暂时解决问题。如果我没有使用 cookie 存储,则需要创建一个新的 HttpClient 实例(因为 cookie 会暂时与 HttpClient 的实例保持一致)
  • 这不是 DNS 问题,因为我可以解决端点(因为我有另一个使用相同端点和相同 crt 的应用程序)。
  • 我正在使用适用于 android 的 AsyncHttp 库,但问题仍然存在于使用该库之外。
  • 我已尝试使用其他版本的 android 设备(不走运)。

我尝试过的有趣的事情:

  • 我创建了一个新的 AsyncHttp 实例,发出请求(未设置 cookiestore)并成功收到响应。然后应用程序使用 cookie 存储创建另一个 AsyncHttp 实例,问题仍然存在。即使在应用程序生命周期之外,第一个(非 cookied)请求也会起作用,但第二个不会。
  • 我厌倦了关闭 tcp_timestamp(暂时通过 proc 中的文件)。没变。

如果有人对类似问题有任何想法或经验,请告诉我。

【问题讨论】:

  • "需要创建一个新的HttpClient实例" -- 除非你使用的是Apache独立封装的HttpClient,否则我建议你使用其他一些HTTP API(例如HttpURLConnection, OkHttp) . Android 在 Android 5.1 中弃用了 HttpClient,在 Android 6.0 中将其从 SDK 中删除,并且几年来一直建议开发人员停止使用它。除此之外,您是否在服务器日志中看到任何注意事项?
  • 我会调查 HttpURLConnection。我正在使用 cz.msebera.android.httpclient。服务器日志中没有任何内容。它永远不会到达服务器,并且在抛出错误时标头返回 null。
  • 您将超时设置调整为什么?
  • 我试过了:短(10秒),长(1+分钟),默认(根本没有设置)
  • @CommonsWare 我删除了 httpClient 的所有实例并移至 OkHttp。问题依然存在。

标签: java android ssl android-async-http


【解决方案1】:

这实际上是与我的服务器代码的会话相关的错误。

【讨论】:

  • 我遇到了完全相同的问题,但是一旦我重新启动 android 设备,问题就会得到解决。你能说出你的服务器端错误到底是什么吗?
  • 我遇到的问题是 PHP + Apache 的会话锁定问题。解决方案是在我从会话中读取所需数据后立即致电session_write_close
猜你喜欢
  • 2017-07-12
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多