探究OkHttpClient的运行原理(5---ConnectInterceptor)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探究OkHttpClient的运行原理(5---ConnectInterceptor)相关的知识,希望对你有一定的参考价值。

参考技术A ConnectInterceptor 即连接拦截器,此拦截器即和 Request 请求的拦截相关;

查看 ConnectInterceptor的 intercept 方法;

ConnectInterceptor 获取到 RetryAndFollowUpInterceptor 拦截器中创建的 StreamAllocation 实例,通过streamAllocation,获取到 HttpCodec 和 RealConnection 实例对象,最后传递相关对象参数调用到下一个拦截器;

获取 HttpCodec 实例对象的方法;

newStream 通过 findHealthyConnection 方法获取到 RealConnection 实例对象,同时创建 HttpCodec 实例对象;

继续调用 findConnection 方法获取 RealConnection 实例对象;

findConnection 方法主要做了以下事情;

先获取定义的 connection,为空的话,通过 connectionPool 连接池中获取,还为空的话,更换路由去查找,查找不到最后创建 RealConnection 放入到下一个路由以及 connectionPool 中;

ConnectionPool 维护了 RealConnection 的双向队列,同时当添加 RealConnection 的时候会开启线程,对 connectionPool 进行相关的清理操作;

ConnectionPool 的 get 方法会对比参数的 Host 对比成功,返回对应 connection,即 Host 相同的时候复用 connection;

StreamAllocation 的 acquire 方法则会赋值 connection 变量;

分析到这里,我们知道了 ConnectInterceptor 会根据 Reqsuet 请求的 Url 的 Host 去对比 ConnectionPool 中查找是否有对应的 connetction 连接已经存在,如果有即复用 connetction ;这里复用的规则即为相同 Host 的请求,这样避免了重新创建 connection;

获取到了 RealConnection 之后即进行进行 connect;

connect 方法主要执行以下流程;
1 通过路由获取安全套件,并验证安全套件是否和协议一致:对于HTTP协议的请求,安全套件中必须包含CLEARTEXT,CLEATTEXT代表着明文传输;android平台本身的安全策略是否允许向相应的主机发送明文请求。
2 进入循环创建连接直到创建成功,跳出循环。
3 首先根据路由判断是否需要建立隧道 ,建立隧道连接 或者建立普通的连接
4 建立协议,指的是建立TSL握手协议
5 对于HTTP2协议,设置连接的最大分配数,指一条HTTP连接上最多同时存在的请求数目。

如果是HTTP协议,不需要建立协议的过程,此时TCP握手已经完成,可以在这个连接上开始于服务器的通信;如果是HTTPS、HTTP2 协议则还需要建立协议 TLS协议,完成TLS的握手,验证服务器证书,以及协商机密算法、传输秘钥。

到这里即完成了 connect 过程分析,返回 RealConnection;

当拿到了 RealConnection 之后,创建 HttpCodec ;

Http2Codec 封装请求的相关参数;

RealConnection 和 Http2Codec 作为参数传入下一个拦截器;

Javascript之运行原理探究

Javascript在Web服务器端执行原理:

1.客户端请求数据,即我们在上网时在地址栏中输入某个网址,浏览器接收到数据之后,向远程web服务器发送请求报文。

2.web服务器响应请求,web服务器找到请求的数据,并将整个页面包含javascript的脚本代码作为相应内容,发送回客户端机器。

3.客户端浏览器解释并执行带Javascript脚本的代码,客户端浏览器打开回应的网页数据内容,从上往下逐行读取并显示其中的html或者脚本代码,根据解析完成的HTML标签完成相应的动作。脚本是从服务器端下载到客

户端,然后在客户端进行的,即不占用服务器端的资源,因此通过客户端脚本,客户端分担了服务器的的任务,大大的减轻了服务器的压力,从而间接地提升了服务器的性能。

 待续……

以上是关于探究OkHttpClient的运行原理(5---ConnectInterceptor)的主要内容,如果未能解决你的问题,请参考以下文章

Javascript之运行原理探究

单元测试运行原理探究

单元测试运行原理探究

从架构出发探究Electron运行原理

iOS底层原理-KVO本质探究

iOS底层原理-KVO本质探究