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、连接建立成功后,如果连接池中存在则加入连接池。
清理连接
往连接池添加数据时,执行清理逻辑。
OkHttp3——连接池相关推荐
- okHttp3连接池简单使用
一.概述: HTTP是现代应用网络的方式.这就是我们交换数据和媒体的方式.有效地执行HTTP可以加快您的负载并节省带宽. OkHttp是一个默认有效的HTTP客户端: HTTP / 2支持允许对同一主 ...
- 001-http-总览、文件配置、常用http client、http连接池
一.概述 http请求项目搭建:地址:https://github.com/bjlhx15/common-study.git 中的common-http 主要针对post请求中的,form表单[app ...
- OkHttp3源码解析(三)——连接池复用
OKHttp3源码解析系列 OkHttp3源码解析(一)之请求流程 OkHttp3源码解析(二)--拦截器链和缓存策略 本文基于OkHttp3的3.11.0版本 implementation 'com ...
- OkHttp3的连接池及连接建立过程分析
如我们前面在 OkHttp3 HTTP请求执行流程分析 中的分析,OkHttp3通过Interceptor链来执行HTTP请求,整体的执行过程大体如下: OkHttp Flow 这些Intercept ...
- OkHttp3源码详解(五) okhttp连接池复用机制
1.概述 提高网络性能优化,很重要的一点就是降低延迟和提升响应速度. 通常我们在浏览器中发起请求的时候header部分往往是这样的 keep-alive 就是浏览器和服务端之间保持长连接,这个连接是可 ...
- android之http协议编程(源码ppt),Android网络编程(八)源码解析OkHttp中篇[复用连接池]...
1.引子 在了解OkHttp的复用连接池之前,我们首先要了解几个概念. TCP三次握手 通常我们进行HTTP连接网络的时候我们会进行TCP的三次握手,然后传输数据,然后再释放连接. TCP三次握手的过 ...
- Okhttp3 链接池复用机制源码探索
前文 对于http请求我们都知道开始于TCP链接的三次握手然后传输数据然后释放,如下图 而当我们开启连接复用keep-alive后就是指在上一次链接不立马断开链接在超时范围内复用connection在 ...
- 连接池和协程池为何能提升并发能力?
你有没有发现,"内存池"和"进程池"都带有"池"字?其实,这两种技术都属于"池化技术".它通常是由系统预先分配一批资源并 ...
- evt参数是干啥用的_http连接池中非常关键的两个参数,到底是干啥用的?
作者简介:大厂一线资深开发.从crud开发到资深开发,再到研究员兼技术经理.<资深开发讲技术> 从一线实战中总结有故事,有背景的案例,希望带给大家一系列技术盛宴. 求关注,欢迎技术交流.友 ...
最新文章
- ReactiveCocoa源码拆分解析(七)
- 二叉树查找python_二叉搜索树的python实现
- 【arduino】初测ESP32的DAC生成AV视频模拟信号项目:ESP32CompositeVideo
- UPS远程监控系统的设计与实现
- 软考-信息系统项目管理师-项目集管理
- VTK:网格之AddCell
- Java黑皮书课后题第3章:**3.21(科学:某天是星期几)泽勒一致性...编写程序,提示用户输入年、月、该月的哪一天,显示它是一周中的星期几
- MySQL各种类型实验
- 【FBI WARNING】一些Noip的黑科技 持续整理!
- php学的是什么意思_为什么要学习PHP?到底什么是PHP?
- java post 请求体构建_java – 从HttpServletRequest获取POST请求体
- 4 5区别 angular 和_初探Angular的更新机制
- elementUI 下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)
- python queue join,python3多线程通信方式,主要理解队列的join()和task_done()方法
- “卫士通”杯首届四川省高校网络攻防大赛文档及题目
- 百度架构师手把手教深度学习之心得
- RecyclerView之利用ItemDecoration实现万能分割线
- QCA三天写论文!清晰集分析实战
- Android之手机振动和振铃
- 漫画丨CTO不得不面对的9大困境