连接池

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

清理连接

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

OkHttp3——连接池相关推荐

  1. okHttp3连接池简单使用

    一.概述: HTTP是现代应用网络的方式.这就是我们交换数据和媒体的方式.有效地执行HTTP可以加快您的负载并节省带宽. OkHttp是一个默认有效的HTTP客户端: HTTP / 2支持允许对同一主 ...

  2. 001-http-总览、文件配置、常用http client、http连接池

    一.概述 http请求项目搭建:地址:https://github.com/bjlhx15/common-study.git 中的common-http 主要针对post请求中的,form表单[app ...

  3. OkHttp3源码解析(三)——连接池复用

    OKHttp3源码解析系列 OkHttp3源码解析(一)之请求流程 OkHttp3源码解析(二)--拦截器链和缓存策略 本文基于OkHttp3的3.11.0版本 implementation 'com ...

  4. OkHttp3的连接池及连接建立过程分析

    如我们前面在 OkHttp3 HTTP请求执行流程分析 中的分析,OkHttp3通过Interceptor链来执行HTTP请求,整体的执行过程大体如下: OkHttp Flow 这些Intercept ...

  5. OkHttp3源码详解(五) okhttp连接池复用机制

    1.概述 提高网络性能优化,很重要的一点就是降低延迟和提升响应速度. 通常我们在浏览器中发起请求的时候header部分往往是这样的 keep-alive 就是浏览器和服务端之间保持长连接,这个连接是可 ...

  6. android之http协议编程(源码ppt),Android网络编程(八)源码解析OkHttp中篇[复用连接池]...

    1.引子 在了解OkHttp的复用连接池之前,我们首先要了解几个概念. TCP三次握手 通常我们进行HTTP连接网络的时候我们会进行TCP的三次握手,然后传输数据,然后再释放连接. TCP三次握手的过 ...

  7. Okhttp3 链接池复用机制源码探索

    前文 对于http请求我们都知道开始于TCP链接的三次握手然后传输数据然后释放,如下图 而当我们开启连接复用keep-alive后就是指在上一次链接不立马断开链接在超时范围内复用connection在 ...

  8. 连接池和协程池为何能提升并发能力?

    你有没有发现,"内存池"和"进程池"都带有"池"字?其实,这两种技术都属于"池化技术".它通常是由系统预先分配一批资源并 ...

  9. evt参数是干啥用的_http连接池中非常关键的两个参数,到底是干啥用的?

    作者简介:大厂一线资深开发.从crud开发到资深开发,再到研究员兼技术经理.<资深开发讲技术> 从一线实战中总结有故事,有背景的案例,希望带给大家一系列技术盛宴. 求关注,欢迎技术交流.友 ...

最新文章

  1. ReactiveCocoa源码拆分解析(七)
  2. 二叉树查找python_二叉搜索树的python实现
  3. 【arduino】初测ESP32的DAC生成AV视频模拟信号项目:ESP32CompositeVideo
  4. UPS远程监控系统的设计与实现
  5. 软考-信息系统项目管理师-项目集管理
  6. VTK:网格之AddCell
  7. Java黑皮书课后题第3章:**3.21(科学:某天是星期几)泽勒一致性...编写程序,提示用户输入年、月、该月的哪一天,显示它是一周中的星期几
  8. MySQL各种类型实验
  9. 【FBI WARNING】一些Noip的黑科技 持续整理!
  10. php学的是什么意思_为什么要学习PHP?到底什么是PHP?
  11. java post 请求体构建_java – 从HttpServletRequest获取POST请求体
  12. 4 5区别 angular 和_初探Angular的更新机制
  13. elementUI 下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)
  14. python queue join,python3多线程通信方式,主要理解队列的join()和task_done()方法
  15. “卫士通”杯首届四川省高校网络攻防大赛文档及题目
  16. 百度架构师手把手教深度学习之心得
  17. RecyclerView之利用ItemDecoration实现万能分割线
  18. QCA三天写论文!清晰集分析实战
  19. Android之手机振动和振铃
  20. 漫画丨CTO不得不面对的9大困境

热门文章

  1. nobody用户介绍
  2. 数据仓库开发之路之一--准备工作
  3. 企业获客的五种方式解读
  4. 简单理解float和double、单精度和双精度
  5. English 背单词
  6. python生成关键词
  7. 神经网络是算法还是模型,神经网络 图像相似度
  8. python中openpyxl库用法详解
  9. 支持nfc的android手机,哪些手机有nfc功能
  10. 深度Deepin系统关机或重启的时候提示unattended upgrades shutdown的解决办法