探究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)的主要内容,如果未能解决你的问题,请参考以下文章