OkHttp3-连接(Connections)

OkHttp3-连接(Connections),第1张

虽然通常你只需要提供一个 URL 给OkHttp,OkHttp就可以帮你完成其他事情。但是实际上OkHttp连接服务器需要三个条件: URL , Address , Route 。

提供一个 URL (比如 https://github.com/square/okhttp )让Http去连接服务器是最基本的工作。还有一种渐渐普遍的文件定位方式称为 URN(同意名称定位符) ,它是利用一种分散式的命名方案去指定所需要访问的资源文件。

URLs 是抽象的:

URL 是具体的:

Address 在OKHttp中是一个对象,它为OkHttp提供静态配置!

地址指定了一个服务器(比如 github.com )以及连接此服务器所需要的静态配置:端口号, HTTPS 设置,以及指定的网络协议(比如 HTTP/2 或者 SPDY )。

相同地址的 URL 也可以共用相同的底层 TCP Socket 连接。共用相同的连接对于性能有很大的提升:更低的延迟,更大的吞吐量(复用连接,由于每个 TCP 启动的都需要较多的准备工作),更少的电能损耗。OkHttp使用一个连接池,来自动复用 HTTP/1.x connections 、 HTTP/2 、 SPDY 连接。

URL为地址提供了一些字段(比如域名、主机名、端口号),其他的字段都来自于 OkHttpClient 。

Routes 在OKHttp中是一个对象,它为OkHttp提供动态配置!

路由提供了实际连接到服务器所需要的动态配置。比如所指定用来尝试连接服务器的 IP 地址(从 DNS 服务商获得)、连接过程中实际所使用到的代理服务器(如果使用了 ProxySelector ),以及使用的是哪个版本的

TLS 协议(当使用 Https 协议连接时候需要)。

对于一个地址来说 ,可能存在有很多种路由的方式。比如,当一个服务器被托管在多个数据中心,这时路由从 DNS 供应商获取的响应中就可以获取到多个 IP 地址。

当你使用OkHttp去请求一个 URL 时,OkHttp为你做了如下事情:

如果在连接的过程中出现问题,那么OkHttp将会选择其他的路由进行重新连接。这意味着当一个服务器的某一个 IP 地址无法访问时,OkHttp可以尝试别的 IP 地址进行访问。或者当一个连接池过期或者你尝试连接的所用的 TLS 版本不受服务器支持时,这种重连机制也是非常有用的。

一旦客户端发来接收到来自服务器的响应,那么这个 Connection 将会被放置到连接池中以备于将来新的连接进行复用。 Connection 在长期不使用的情况下,将会从这个连接池中被移除。

··

注释1:WebSocket是一个接口,它的实现类RealWebSocket,该类完成WebSocket的连接、数据请求与接收功能。

注释1:将RealCall实例添加至Dispatcher中(下文会介绍Dispatcher)。

注释2:通过getResponseWithInterceptorChain()获取响应。

注释3:通过封装好的拦截器集合,获取第一个拦截器的任务。

注释4:触发第一个拦截器的任务,该任务就触发一下拦截器的任务,以此类推,原理(Android事件传递机制)如下图:

注释1:把AsyncCall请求对象传递进Dispatcher线程池管理;

注释2:通过getResponseWithInterceptorChain()获取响应

注释1:获取自定义线程池;

注释2:判断正在执行的异步请求数量与请求集合中相同host的数量是否满足,如果满足就添加到执行中的集合中,并添加至线程池中执行请求;如果不满足就添加至待执行请求的集合中,等待执行中的请求完成之后,再执行相同host数量判断满足才添加至线程池中执行请求;

注释3:将请求对象AsyncCall添加进请求执行的集合中;

注释4:将请求对象AsyncCall添加进线程池中执行;

注释5:当不满足执行条件时(注释2),把请求对象添加至待执行的集合中;

注释6:每当一个请求执行完毕时,就会调用finished()去掉对应集合中的存储对象,并在次判断待执行的集合中是否有满足条件的请求,若满足就添加至执行的集合与线程池中执行,若不满足继续等待下一个请求完成再次判断。

注释7:判断待执行的集合中是否满足可执行的对象。

2.RealConnection与HttpCodec初始化(RealConnection在ConnectInterceptor中通过StreamAllocation的newStream()初始化,而HttpCodec在RealConnection中被初始化)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6622160.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-25
下一篇 2023-03-25

发表评论

登录后才能评论

评论列表(0条)

保存