安全的连接
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.往服务器发送数据拦截器
发请求,读相应
运行
读响应
然后反式调用上一个拦截器