Connections

  尽管你只提供了URL,OkHttp使用三种类型来创建它和你的web服务器的连接:URL,地址(Address)和路由(Route)。

URLs

  URLs (例如 https://github.com/square/okhttp) 是HTTP和互联网的基础。除了作为网络上所有事物的一种通用的,去中心化的命名策略,它们还指明了如何访问网络资源。

  URLs是抽象的:

  1. 它们指定了访问是明文的(http)还是加密的(https),但没有指明哪些加密算法不应该被使用。也没有指定如何验证对方的证书(HostnameVerifier) 和哪些证书被信任(SSLSocketFactory)。

  2. 它们没有指定是否应该使用特定的代理服务器,以及如何认证代理服务器。

  它们也是具体的:每一个URL标识了一个明确的路径(例如 /square/okhttp) 和查询参数(例如 ?q=sharks&lang=en)。每一个web服务器会支持很多的URL。

Addresses

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

  共享同样地址的URL可能也共享同样的底层TCP套接字连接。共享连接有明显的性能优势:更少的延迟,更高的吞吐量(归因于TCP慢启动) 和节省电量。OkHttp使用了一个ConnectionPool来自动重用HTTP/1.x连接,多路复用HTTP/2和SPDY连接。

  在OkHttp中,地址的部分字段来自于URL(协议,主机名和端口),其余的来自OkHttpClient

Routes

  路由提供了真正连上web服务器所需要的动态信息。这是一个用于尝试的特定的IP地址(比如由DNS查询发现的),使用的正确的代理服务器(如果用了ProxySelector)和使用哪个版本的TLS来协商(用于HTTPS连接)。

  单一的地址可能存在多个路由。例如,一个托管在多个数据中心的web服务器在它的DNS响应中可能产生多个IP地址。

Connections

  当你使用OkHttp请求一个URL,下面是它会做的:

  1. 它使用这个URL和配置后的OkHttpClient来创建一个address。这个地址说明了我们将如何连接到web服务器。

  2. 它尝试从connection pool中取出使用这一地址的连接。

  3. 如果在池中没有发现可用的连接,它会选择一个route来尝试。这通常意味着做一个DNS请求来获取服务器的IP地址。然后,如果需要,它会选择一个TLS版本和代理服务器。

  4. 如果它是一个新的路由,它会建立一个直接的套接字连接,或者TLS隧道(用于HTTPS穿越HTTP代理),或者直接的TLS连接。如果需要,它会做TLS握手。

  5. 它发送HTTP请求,读取响应。

  如果连接出了问题,OkHttp会选择另一个路由然后重试。这让OkHttp在部分服务器地址不可访问时可以恢复。在连接池中的连接过期或者尝试的TLS版本不支持时,这种重试也是有用的。

  一旦接收到了响应,连接会返回到连接池中,等待在将来的请求中重用。连接在一段时间不被激活后,会从连接池中删除。

学习okhttp wiki--Connections.的更多相关文章

  1. 学习okhttp wiki--HTTPS

    HTTPS OkHttp尝试平衡两个相互竞争的要素: 连通性(Connectivity):连接到尽可能多的服务器.这包括运行最新版本 boringssl 的服务器和不太过时的老版本 OpenSSL 的 ...

  2. 学习OkHttp wiki--Interceptors

    Interceptors 拦截器(Interceptors)是一种强有力的途径,来监控,改写和重试HTTP访问.下面是一个简单的拦截器,对流出的请求和流入的响应记录日志. class LoggingI ...

  3. OkHttp 官方Wiki【设计思想】

    官方Wiki之Calls 原文位置:https://github.com/square/okhttp/wiki/Calls The HTTP client's job is to accept you ...

  4. OkHttp 官方Wiki之【使用案例】

    原文位置:https://github.com/square/okhttp/wiki/Recipes Recipes 食谱/知识点清单 We've written some recipes that ...

  5. okhttp 基本介绍

    资料汇总 官网:http://square.github.io/okhttp/ 文档:https://github.com/square/okhttp/wiki GitHub:https://gith ...

  6. 使用OkHttp和OkHttpGo获取OneNET云平台数据

    图1是OneNET官网关于NB-IoT文档关于批量查询设备最新数据的介绍,可以看到GET方法的URL地址和两个头部信息(图2是Htto请求消息结构).所以在写url时,还要添加两行头部字段名,不然获取 ...

  7. OkHttp 3.4入门

    OkHttp 3.4入门 配置方法 (一)导入Jar包http://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.4.0-RC1/okhtt ...

  8. OkHttp使用进阶 译自OkHttp Github官方教程

    版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/3997368.html 没有使用过OkHttp的,可以先看Ok ...

  9. OkHttp使用进阶(译自OkHttp官方教程)

    没有使用过OkHttp的,可以先看OkHttp使用介绍 英文版原版地址 Recipes · square/okhttp Wiki 同步get 下载一个文件,打印他的响应头,以string形式打印响应体 ...

随机推荐

  1. java多线层同时运行的解决,同步代码块synchronized

    /* 多个线层同时操作一个数据 会导制数据超出 同步代码块 synchronized(对像) { 需要同步的代码 } */ class Do7 { public static void main(St ...

  2. c++ 链表删除重复的数据

    //List.h #include <iostream> typedef int dataType; struct Node{ Node():data(),pNextNode(NULL){ ...

  3. Backbone的id

    id 在model.attributes中,需要用户自行定义,可不定义,获取方法:model.get('id') cid collection中每个model都有的属性,由backbone自动生成,获 ...

  4. php 中PHP_EOL使用

    一个小小的换行,其实在不同的平台有着不同的实现,为什么要这样,可以是世界是多样的.本来在unix世界换行就用/n来代替,但是windows为了体现他的不同,就用/r/n,更有意思的是在mac中用/r. ...

  5. python 如何重新加载有修改过的模块(module)

    写 Python 程序的时候,一边写模块一边调试.调试是在 Python 自身的命令行终端进行的.但当对模块里的代码进行修改后,在原调试终端上执行到模块中新修改上去的内容. 我之前是一直用退出再重新进 ...

  6. Robot Framework自动化测试---元素定位

    不要误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加入了selenium2的 ...

  7. iTween_ValueTo函数

    ValueTo:返回一个插值在两件值之间的值供回调函数使用; 网上没找到例子,自己试了下,直接看代码就明白了. , 0, 0),// gameObject.transform.position为0.0 ...

  8. Log4j MDC Tomcat下报异常org.apache.log4j.helpers.ThreadLocalMap

    严重: The web application [/qdgswx] created a ThreadLocal with key of type [org.apache.log4j.helpers.T ...

  9. mysql常用查询归纳

    一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数) .where常用运算符: 比较运算符 > ...

  10. SOA 新业务语言 新系统架构——什么是SOA

    原文地址:http://blog.csdn.net/ichaos/archive/2008/01/20/2054377.aspx SOA的概念是Gartner在1996年提出来的,并于2002年12月 ...