提供一个 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中被初始化)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)