OkHttp3——连接池

连接池

每次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、连接建立成功后,如果连接池中存在则加入连接池。                                

          
清理连接     

   往连接池添加数据时,执行清理逻辑。

   

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值