

安全的连接
OkHttpClient:

OkHttpClient:


1.线程调度
2.连接池,有则复用,没有就创建
3.interceptor
4.interceptor
5.监听工厂
6.是否失败重试
7.自动修正访问,如果没有权限或认证

8是否重定向 followRedirects
9.协议切换时候是否继续重定向
10.Cookie jar 容器 默认返回空的

11.本地缓存
12 dns 域名解析为dns地址

通过原生方式,根据域名获取DNS/IP地址
13.代理服务器

直连,http,Socket
14.代理的select

默认直连
15.代理授权
16.sslsocket工厂
17.x509 证书验证器,验证合法性
18.连接标准 比如版本 http 1.1 2.0



严格 - 一般 - 基本无限制

不加密传输
19.支持的协议



不加密的HTTP2
20 21 22:
证书验证相关


如果配置错误则会打印报错
![]()
多证书


23. call连接超时
24. 网络连接超时
25.读取超时
26.写入超时
27.心跳频率 websocket / http 2
enqueue 是一个接口 Call




client 通用配置等参数
Request 请求相关参数,初始的request
forwebsocket websocket 服务器主动发消息,推送数据,通过http连接
RealCall Call接口实现类


1 跟踪程序的错误
2 监听所有事件 比如连接 断开 等
enqueue: 执行client.dispatcher.enqueue(AsyncCall xxx)
![]()

dispatcher 线程调度用的Executor


enqueue:


尝试找到有没有当前url的主机
传入AsyncCall 添加到队列,双向队列,准备还未执行的操作

执行已经准备好的Call

取出所有的call 并且取出的值小于设定的值,添加到正在执行的call
遍历执行 executeOn,则执行runnable


executee() = runnable,发生了线程切换

run

获取相应 getResponseWithInterceptorChain ,然后传给回调

execute: 同步执行, 直接调用getResponseWithInterceptorChain

getResponseWithInterceptorChain:
将各种拦截器添加到集合中

创建一个拦截器的chain

链式工作
每一个都有前置后置任务


1 第一个拦截器 ,连接错误等进行重置连接

请求,然后重试

判断是哪种错误

找到一个可用连接

如果是重定向等,继续重试

成功则返回结果,否则继续重试


复制一份执行,然后调用下一个链条
2:将已经准备好的连接进行发送和过滤判断
将参数 content-length等进行填充

自动进行压缩 / 解压缩 gzip

3.缓存拦截器

有缓存直接返回

缓存类型:

没有则进行缓存

4.连接拦截器

init

coedc:编码/解码器,然后拼接成Exchange
找到可用健康的连接

先拿到可用连接

然后判断状态,最多5种方式拿到
取消掉的

有没有已经建立
![]()
结果为空则执行,把call放到池里的连接

多复用,判断是否可用

拿到一个连接

判断有没有超限,判断是否是同一个主机TCP端口以及加密方式和代理等配置是否相同,

判断代理

判断 http2
判断证书

如果已经拿到连接,直接返回,否则再进行重试
复用已经使用过且相等地址端口证书的连接

5次连接:
1有连接直接复用,
2拿不到则在连接池取一个不多重复用的连接,
3在拿一个多复用连接,
4自己创建一个连接,
5重新取池里多重复用的连接
5.往服务器发送数据拦截器
发请求,读相应

运行


读响应

然后反式调用上一个拦截器
