连接池
每次Request都创建新的Http连接,容易浪费资源和时间,TCP3次握手,断开连接要2次或4次挥手。Http1.0中有Keep-Alive用来保持连接,在一定时间范围内,相同的请求复用旧连接。在OkHttp中使用了连接池,最大允许5个并发连接,存活时间为5分钟,这样节约资源和缩短响应时间。
ConnectionPool --> RealConnectionPool(里面包含List<Realconnection>)
连接池具有以下特点:
- 连接池管理所有Socket连接,当有新的请求时从池中分配一个链路
- 默认支持5个并发keepalive,链路生命为5分钟(链路数据传输完成,保持5分钟的存活时间)
- 自动清除线程,将超过5分钟的链路关闭socket
OkHttp真正的连接是在ConnectInterceptor中通过 Transmitter(realChain.transmitter)查找并连接。
建立连接流程:
ConnectInterceptor transmitter.newExchange()
|__Transmitter exchangeFinder.find()
|__ ExchangeFinder .findHealthyConnection()
|__ ExchangeFinder .findConnection() 重点
1、当前连接是否存在,存在则直接返回;
不存在则:根据address去连接池中查找 connectionPool.transmitterAcquirePoooledConnection()
1.1 查找符合条件的连接,进行复用 connection.isEligible(address,routes)
是否超过最大连接数 、连接地址是否相同(主要参考 Address.equals())、连接是否清除 。对于不符号条件,直接返回null。
2、在步骤一前获取当前连接,可用则释放连接。
3、经过步骤一(直接获取当前连接或连接池中复用),连接不为null则直接返回;连接为null则创建新的连接(见步骤4)
4、创建新的连接,首先要选择路由(RouteSelector 主要功能:实现充实服务器访问功能,包括代理轮询、ip地址轮询;根据能成功访问的代理服务器proxy、ip地址、address创建路由。)
|__ this.routeSelector.next() 选择路由
5、路由选择完成后,根据路由在连接池中查找连接,找到连接则直接返回;没有找到则创建新的连接(见步骤6)
6、创建连接
|__new Realconnection()
7、建立连接
|__result.connect()
https则通过通道建立连接;否则通过Socket建立连接。最后构建协议。
8、连接建立成功后,如果连接池中存在则加入连接池。
清理连接
往连接池添加数据时,执行清理逻辑。