Android中okhttp原理详解_guodashen007的博客-程序员宝宝_安卓okhttp原理

技术标签: MyOkHttp  

目录

1、okhttp工作的大致流程
2、okhttp中的连接池
3、参考连接

 

OkHttp3的最底层是Socket,而不是URLConnection,它通过Platform的Class.forName()反射获得当前Runtime使用的socket库

socket发起网络请求的流程一般是:
(1). 创建socket对象;
(2). 连接到目标网络;

(3). 进行输入输出流操作。

(1)(2)的实现,封装在connection接口中,具体的实现类是RealConnection。
(3)是通过stream接口来实现,根据不同的网络协议,有Http1xStream和Http2xStream两个实现类
由于创建网络连接的时间较久(如果是HTTP的话,需要进行三次握手),而请求经常是频繁的碎片化的,所以为了提高网络连接的效率,OKHttp3实现了网络连接复用
 

1、okhttp工作的大致流程

1.1、整体流程

(1)、当我们通过OkhttpClient创建一个Call,并发起同步或异步请求时;
(2)、okhttp会通过Dispatcher对我们所有的RealCall(Call的具体实现类)进行统一管理,并通过execute()及enqueue()方法对同步或异步请求进行处理;
(3)、execute()及enqueue()这两个方法会最终调用RealCall中的getResponseWithInterceptorChain()方法,从拦截器链中获取返回结果;
(4)、拦截器链中,依次通过RetryAndFollowUpInterceptor(重定向拦截器)、BridgeInterceptor(桥接拦截器)、CacheInterceptor(缓存拦截器)、ConnectInterceptor(连接拦截器)、CallServerInterceptor(网络拦截器)对请求依次处理,与服务的建立连接后,获取返回数据,再经过上述拦截器依次处理后,最后将结果返回给调用方。
提供两张图便于理解和记忆:


okhttp整体流程1okhttp整体流程2

这张图只画出了请求流程,没有数据返回流程,后期会处理

1.2.4、ConnectInterceptor:负责与服务器建立连接

使用StreamAllocation.newStream来和服务端建立连接,并返回输入输出流(HttpCodec),实际上是通过StreamAllocation中的findConnection寻找一个可用的Connection,然后调用Connection的connect方法,使用socket与服务端建立连接。

1.2.5、CallServerInterceptor:负责从服务器读取响应的数据

主要的工作就是把请求的Request写入到服务端,然后从服务端读取Response。
(1)、写入请求头
(2)、写入请求体
(3)、读取响应头
(4)、读取响应体

连接池原理

由于HTTP是基于TCP,TCP连接时需要经过三次握手,为了加快网络访问速度,我们可以Reuqst的header中将Connection设置为keepalive来复用连接。

Okhttp支持5个并发KeepAlive,默认链路生命为5分钟(链路空闲后,保持存活的时间),连接池有ConectionPool实现,对连接进行回收和管理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guodashen007/article/details/104953861

智能推荐

产品经理必读:用户场景分析的四要素_大数据v的博客-程序员宝宝

导读:用户场景是指用户在不同时间、地点、环境下引发的不同心境、行为或需求,其实就是指用户在某个环境中会触发并完成某个任务。作者:朱军华来源:大数据DT(ID:hzdashuju)假如让你列...

vs2013配置openGL编译环境_aldenphy的博客-程序员宝宝

同GSL环境的配置方法,见前文:

搭建P2P VoIP应用程序的仿真可控网络测试环境_weide001的博客-程序员宝宝_搭建p2p测试环境

1.概述skype和gtalkSkype与GTalk是VoIP应用的两个典型代表。Skype与GTalk使用的是UDP/TCP传输协议,使用相同的编解码器。Skype与GTalk继承了P2P网络的一些特性,如各节点间合作且共享网络资源。Skype采用全球搜索目录(GI)技术,GI是一种可扩展网络技术,它使用多层的网络结构,利用超节点来实现网络中的每个节点可以获取所有其他可利用节点的资源

JFlash ARM对stm32程序的读取和烧录_luck_horse的博客-程序员宝宝_jflasharm读取

本篇文章主要是记录一下JFlash ARM 的相关使用和操作步骤,读取程序说不上破解,这只是在没有任何加密情况下对Flash的读写罢了!在我们装了JLINK驱动后再根目录下找到JFlash ARM ,运行。读取Flash程序:第一步:Option-->Project Settings-->CPU下选择  Device 在下拉菜单中找到自己的芯片型号后点击确定。第二...

循环进阶---->一环套一环_weixin_30609287的博客-程序员宝宝

二重循环的几种语法://while与while循环嵌套 while (循环条件1) { //循环操作1 while (循环条件2) { //循环操作2 } } //do-while与do-while循环嵌套 ...

随便推点

[Leetcode] 350. Intersection of Two Arrays II 解题报告_魔豆Magicbean的博客-程序员宝宝

题目:Given two arrays, write a function to compute their intersection.Example:Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].Note:Each element in the result should app

direct do造句 sb to_wish to do造句_weixin_39655049的博客-程序员宝宝

有wish to do sth。吗???有(看例句1)wish表示“希望”(大多难以实现或与事实相反),往往带有“祝愿”的意味。wish后常跟不定式、双宾语、复合宾语(宾语+形容词/副词)、for+名词、宾语+不定式等结构。例如:(例句1)I wish to see your manager, please。我想见见你们的经理。We wish him well again soon。我们祝他身体早...

JS的引入方式_变量的使用_变量的类型_有园人的博客-程序员宝宝

JS的俩种引入方式:1.<!--js的引入方式1--> <script> /*网页中的弹框*/ alert("js的学习!!") </script>2.<!-- js的引入方式2 src=引入文件的路径 charset=指定引入的编码 注意:引入js的时候千万不要二合一 ...

【Orcale】------- Orcale 实现中文转拼音/缩写大小写/全拼音大小写_皮皮冰要做大神的博客-程序员宝宝

1.需要在orcale里面导入一下sql;oracle汉字转拼音ORACLE中文转拼音缩写.sql(35.9 KB)链接:https://pan.baidu.com/s/12hGCAzT5YTms7Sq69NIM2w提取码:i6bv导入操作方法如下:在执行sql语句的执行框内输入:SQL> @D:/ BaoXiaoGuanLio / ORACLE中文转拼音缩...

wps怎么添加书签页面_Giser板栗糖的博客-程序员宝宝

工作疑难这个专栏只是为了记录工作中的点点滴滴,文章很水的哈

pytorch bilstm-crf的crf score代码实现详解_king的江鸟的博客-程序员宝宝

本文适合已经基本了解crf原理的读者,深入探究代码层面的实现原理1. _forward_alg代码 def _forward_alg(self, feats): # Do the forward algorithm to compute the partition function init_alphas = torch.full((1, self....