【问题标题】:OkHttp connection timeoutOkHttp 连接超时
【发布时间】:2016-06-30 19:27:22
【问题描述】:

OkHttp 让你可以像设置连接超时

    OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setConnectTimeout(connectTimeout, TimeUnit.SECONDS);
    okHttpClient.setReadTimeout(readTimeout, TimeUnit.SECONDS);

以下理解正确吗?

连接超时 - 这是与服务器建立连接之前的超时时间

读取超时 - 这是连接进行中的时间,无论是否正在读取数据都会超时。

基于此,在读取超时期间打开的连接会发生什么? OkHttp 是否会让服务器知道连接因超时而关闭?一旦出现读取超时,我想关闭与服务器的连接。我不认为 OkHttp (2.2.0) 正在发送靠近服务器的套接字。这可能与 SO 上的this 问题有关

【问题讨论】:

    标签: android okhttp


    【解决方案1】:

    如果 OkHttp 给你一个响应,你有责任关闭它的响应体。最好的方法是使用 try/finally 子句。

    Response response = call.execute();
    try {
      String line;
      while ((line = response.body().source().readUtf8Line()) != null) {
        System.out.println(line);
      }
    } finally {
      response.body().close();
    }
    

    【讨论】:

    • 我遇到的是,我对服务器进行了 POST,连接速度很慢,读取超时为 20 秒,okhttp 在 20 秒后按预期抛出 sockettimeoutexception,但飞行请求仍然完成后20 秒。客户端不知道请求成功,因为它已经超时。服务器可能没有收到来自客户端的套接字关闭,因此它继续执行 POST 请求。我是否必须在请求上显式调用 cancel() 以避免服务器尝试完成操作?
    • 如果您没有收到回复,您就没有什么可关闭的了。
    【解决方案2】:

    ConnectionTimeOut 是 TCP 握手发生的超时时间。所以它是用于客户端和它的服务器之间的连接。

    ReadTimeOut 是等待读取数据的超时时间。如果服务器在超时后的最后一个字节后未能发送一个字节,则会引发读取超时错误。

    因此,您的连接将自动为您关闭。所以你只需要执行异常处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-28
      • 2015-10-24
      • 2014-11-15
      • 2018-04-30
      • 2018-06-15
      • 2016-05-28
      • 2020-11-12
      • 2022-01-21
      相关资源
      最近更新 更多