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. linux目录权限小记

    r : 拥有读取目录结构列表的权限 x:拥有进入此目录的权限 w: 1: 建立新的档案和目彔: 2删除已经存在的档案和目录(无论该档案的权限为何!) 3能够重命名档案和目录: 4 能够移动目录里面的 ...

  2. Swift - defer关键字(推迟执行)

    在一些语言中,有try/finally这样的控制语句,比如Java. 这种语句可以让我们在finally代码块中执行必须要执行的代码,不管之前怎样的兴风作浪. 在Swift 2.0中,Apple提供了 ...

  3. jQuery选择器全解

    本篇介绍jQuery的选择器,jQuery选择器按照功能上分为"选择"和"过滤",并且是配合使用的.过滤的主要作用是从前面选定的选择器中选择的内容重进行筛选. ...

  4. jq不识别拼接的对象id的解决方案

    今天在做项目时,遇到了这么个问题. 先声明一下,我的id都是动态变换的.从1-10呢. <div id="a1"></div> <div id=&qu ...

  5. eclipse python开发环境搭建

    eclipse python开发环境搭建[非原创] 1.在www.eclipse.org官网下载Eclipse Classic 4.2.2,Win7 64位下载eclipse-SDK-4.2.2-wi ...

  6. ON UPDATE CURRENT_TIMESTAMP

    CREATE TABLE time1 (   id SMALLINT,   time1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TI ...

  7. 使用PyQt4写界面后台程序方法总结

    使用PyQt4编写界面后台程序的方法总结 一.怎么建立多线程 界面程序如果有稍微耗时一点的任务如果不使用多线程就会界面卡死,所以大多数情况会使用到多线程.PyQt4自己有多线程的机制,可以派生多线程类 ...

  8. 消息机制2 - Windows程序设计(SDK)005

    消息机制2 让编程改变世界 Change the world by program 内容节选: 关于消息机制,还有三点需要补充: 消息队列是FIFO的形式 WM_PAINT,WM_TIMER 和 WM ...

  9. VMware vSphere 6 Enterprise Plus License

    Product: VMware vSphere 6 Enterprise Plus Licensed for 2 physical CPUs (unlimited cores per CPU) Lic ...

  10. JSP(二)

    一.pageContext对象    1>代表当前JSP页面的运行环境, [作用域仅仅局限于当前JSP页面中,出了该JSP页面, 原PageContext域对象被销毁]    2>封装了对 ...