图文详解OkHttp的超时时间

 更新时间:2021年10月13日 12:04:34   作者:今天i你好吗  
HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽,OkHttp是一个高效的HTTP客户端,下面这篇文章主要给大家介绍了关于OkHttp超时时间的相关资料,需要的朋友可以参考下

前言

虽然网上有很多关于okhttp超时时间的文章但大多都一笔带过并没有进行详细的讲解各自的作用,于是就看了下源码大致写一下其中的发现.

本文以 'com.squareup.okhttp3:okhttp:3.12.0'源码为参考

首先我们一共可以设置5个超时时间分别如下:

OkHttpClient client = new OkHttpClient.Builder()

.connectTimeout(30, TimeUnit.SECONDS)

.callTimeout(120, TimeUnit.SECONDS)

.pingInterval(5, TimeUnit.SECONDS)

.readTimeout(60, TimeUnit.SECONDS)

.writeTimeout(60, TimeUnit.SECONDS)

.build();

其中callTimeout,readTimeout,writeTimeout和okio的AsyncTimeout有着密不可分的关系,其内部维护了一个Watchdog,单独开一个线程死循环判断是否超时

connectTimeout:

指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。

通过跟源码发现这个值用在了 socket.connect(address, connectTimeout);

callTimeout:

这个值从调用call.execute();和enqueue();这两个方法开始计时,时间到后网络还未请求完成将调用cancel();方法
在RealCall类中可以看到在构造方法中创建timeout匿名内部类

在execute方法中开始计时

在timeoutExit方法中结束计时

pingInterval

通过跟源码我们可以看到,这个值只有http2和webSocket中有使用

如果设置了这个值会定时的向服务器发送一个消息来保持长连接

所以在写websocket时是完全可以只用设置这个值来保持长连接的.

客户端在发送ping消息时服务端会相应的返回pong消息来进行回应.同时okhttp也实现了pong,服务端在发起ping的时候客户端会通过pong来进行回应,即:在进行长连接时,客户端不需要进行只需要服务端进行定时ping也是可以保持长连接的.

接下来就开始讲和我们密切相关的readTimeout和writeTimeout了,当然也是最复杂的.其中最重要的还是readTimeout,我们先看writeTimeout

writeTimeout

这个值大致有3个地方用到

其中第二处和第三处的用用法是一致的,最后都是调用了

sink.timeout().timeout(writeTimeout, MILLISECONDS);

这写到底是什么意思呢?

这个就不得不说okio了,okhttp中几乎所有的流的操作都是由okio完成的,在okio.AsyncTimeout中对Sink(类似于OutputStream)和Source(类似于InputStream)进行了一层封装

/**

Don't write more than 64 KiB of data at a time, give or take a segment. Otherwise slow
connections may suffer timeouts even when they're making (slow) progress. Without this, writing
a single 1 MiB buffer may never succeed on a sufficiently slow connection.
*/
private static final int TIMEOUT_WRITE_SIZE = 64 * 1024;

这其中的逻辑还是相当复杂的,大致意思就是所有的sink都被封装了一个超时机制,需要在我们设置的时间内写出TIMEOUT_WRITE_SIZE(64k)的数据,如果无法完成即为超时,所以,我们在上次文件时明明只设置了几十秒的超时时间却不会超时.

在http2中就没有再使用okio的超时机制了,当然超时计时器还是用的AsyncTimeout.的Watchdog




可以看到,在http2中采用的是线程等待的策略

readTimeout

readTimeout和writeTimeout几乎完全一样,只是操作相反,而且header的读取和body的读取是分开进行的,由于header数据量较小就不用讨论了.

okio中每次读取不大于8k.

final class Segment {
/** The size of all segments in bytes. */
static final int SIZE = 8192;

http2中每次读取不大于8k.

然后还漏了一点:

socket.setSoTimeout(chain.readTimeoutMillis());


这行代码什么意思呢?

setSotimeout(10000)是表示如果对方连接状态10秒没有收到数据的话强制断开客户端。
如果想要长连接的话,可以使用心跳包来通知服务器,也就是我没有发给你数据,但是我告诉你我还活着.

最后,如果超时时间设置的如果是0,那么代表超时时长为无限.

附上okhttp的默认超时时间

总结

到此这篇关于OkHttp的超时时间的文章就介绍到这了,更多相关OkHttp超时时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于Nacos和Eureka的区别及说明

    关于Nacos和Eureka的区别及说明

    这篇文章主要介绍了关于Nacos和Eureka的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Java获取视频时长、大小的示例

    Java获取视频时长、大小的示例

    这篇文章主要介绍了Java获取视频时长、大小的示例,帮助大家利用Java处理视频,完成需求,感兴趣的朋友可以了解下
    2020-11-11
  • Springcloud之Gateway组件详解

    Springcloud之Gateway组件详解

    Spring Cloud Gateway是Spring Cloud微服务生态下的网关组件。Spring Cloud Gateway是基于Spring 5和Spring Boot 2搭建的,本质上是一个Spring Boot应用。本文详细介绍了SpringCloud的网关组件 Gateway,,需要的朋友可以参考下
    2023-05-05
  • pageHelper一对多分页解决方案示例

    pageHelper一对多分页解决方案示例

    这篇文章主要为大家介绍了pageHelper一对多分页解决方案示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java获取文件的路径及常见问题解决方案

    Java获取文件的路径及常见问题解决方案

    这篇文章主要介绍了Java获取文件的路径及常见问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • JAVA数据结构之汉诺塔代码实例

    JAVA数据结构之汉诺塔代码实例

    这篇文章主要介绍了JAVA数据结构之汉诺塔,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • springboot整合netty过程详解

    springboot整合netty过程详解

    这篇文章主要介绍了springboot整合netty过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)

    Java并发系列之AbstractQueuedSynchronizer源码分析(独占模式)

    这篇文章主要为大家详细介绍了Java并发系列之AbstractQueuedSynchronizer源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • 详解Java的继承

    详解Java的继承

    大家好,本篇文章主要讲的是详解Java的继承,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Java基本知识点之变量和数据类型

    Java基本知识点之变量和数据类型

    这篇文章主要给大家介绍了关于Java基本知识点之变量和数据类型的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论