java okhttp3使用java连接池用哪个时,如何获取当前连接的名称或者ID

OkHttp3.7源码分析文章列表如下:


接下来講下OkHttp的java连接池用哪个管理这也是OkHttp的核心部分。通过维护java连接池用哪个最大限度重用现有连接,减少网络连接的创建开销以此提升网絡请求效率。

这种方法的好处是简单各个请求互不干扰。但在复杂的网络请求场景下这种方式几乎不可用例如:浏览器加载一个HTML网页,HTML中可能需要加载数十个资源典型场景下这些资源中大部分来自同一个站点。按照HTTP1.0的做法这需要建立数十个TCP连接,每个连接负责一个資源请求创建一个TCP连接需要3次握手,而

本文内容由互联网用户自发贡献版权归作者所有,本社区不拥有所有权也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容欢迎发送邮件至:

进行举报,并提供相关证据一经查实,本社区将立刻删除涉嫌侵权内容

Android开发者&前端菜鸟,专注于跨平台、热修复领域

}

版权声明:本文为博主原创文章遵循

版权协议,转载请附上原文出处链接和本声明

首先我们需要明白,okhttp比其他网络请求框架的优势在哪里当然最重要的就是他对传輸层的Socket进行了进一步的封装。所谓的封装就是拿到服务器最原始的数据流,进行解析返回给用户。大家需要明白一点socket的连接是需要消耗资源的,如果每一次网络请求都去创建一个socket显然是不合理的。所以okhttp就引出了java连接池用哪个的概念所谓的java连接池用哪个就是为了复鼡socket,比如我们请求一个地址如果下一次在规定时间内,发送同样的请求那么socket就会被复用。

所谓的连接对象可以说是封装了Socket。并且记錄最后使用它的时刻
构造方法中创建socket对象,并且记录当前时间:
提供方法判断是否可以复用该连接对象:

keepLive:超过这个时间,将会回收連接对象
isRunning:防止回收线程重复启动
idleTime:当前连接对象的闲置时间


在这里就开启了清理线程清理线程就是一个缓存线程池


这里开启一个while循环,内部使用waitTime判断何时需要跳出死循环即队列中没有连接对象就可以跳出死循环。这里会调用clean()方法做真正的清理工作


这里会判断当前连接对象的闲置时间是否已经超过了最大等待时间,然后从队列中移除这些对象并且计算出所有连接对象的最大闲置时间,计算出下一次進行clean的时间


供外部调用,如果需要复用该连接对象直接从队列中取出来。

三、创建java连接池用哪个使用管理类


使用java连接池用哪个首先判断当前对象是否存在于java连接池用哪个中,没有的话需要添加到java连接池用哪个并且记录当前对象的添加时间。

结果显示没有在java连接池用哪个中的会创建新的连接对象存在的会复用连接对象。

ok这样一个java连接池用哪个就被我们完成了。附上完整代码

}

这些Interceptor中每一个的职责这里不再贅述。

在OkHttp3中StreamAllocation是用来建立执行HTTP请求所需网络设施的组件,如其名字所显示的那样分配Stream。但它具体做的事情根据是否设置了代理以及请求的类型,如HTTP、HTTPS或HTTP/2的不同而有所不同代理相关的处理,包括TCP连接的建立在 一文中有详细的说明。

  • 设置了HTTP代理的HTTP请求与代理建立好TCP连接;
  • 设置了HTTP代理的HTTPS请求,与HTTP服务器建立通过HTTP代理的隧道连接并完成TLS握手;
  • 设置了HTTP代理的HTTP/2请求,与HTTP服务器建立通过HTTP代理的隧道连接并完荿与服务器的TLS握手及协议协商;
  • 设置了SOCKS代理的HTTP请求,通过代理与HTTP服务器建立好连接;
  • 设置了SOCKS代理的HTTPS请求通过代理与HTTP服务器建立好连接,並完成TLS握手;
  • 设置了SOCKS代理的HTTP/2请求通过代理与HTTP服务器建立好连接,并完成与服务器的TLS握手及协议协商;
  • 无代理的HTTP请求与服务器建立好TCP连接;
  • 无代理的HTTPS请求,与服务器建立TCP连接并完成TLS握手;
  • 无代理的HTTP/2请求,与服务器建立好TCP连接完成TLS握手及协议协商。

后面我们更详细地来看一下这个过程

完成前述所有的连接建立工作,并将这个过程中创建的用于网络IO的RealConnection对象以及对于与服务器交互最为关键的HttpCodec等对象传递給后面的Interceptor,也就是CallServerInterceptor

OkHttp3将客户端与服务器之间的连接抽象为Connection/RealConnection,为了管理这些连接的复用而设计了ConnectionPool共享相同Address的请求可以复用连接,ConnectionPool实现了哪些连接保持打开状态以备后用的策略

ConnectionPool还会对java连接池用哪个中最大的空闲连接数及连接的保活时间进行控制,maxIdleConnectionskeepAliveDurationNs成员分别体现对最大空闲連接数及连接保活时间的控制这种控制通过匿名的Runnable

在默认情况下,ConnectionPool 最多保存 5个 处于空闲状态的连接且连接的默认保活时间为 5分钟

  • RealConnection 才昰真正能复用的具体看一下Address相等性比较的依据: 这种相等性的条件给人感觉还是蛮苛刻的,特别是对url的对比 这难免会让我们有些担心,对 Address 如此苛刻的相等性比较又有多大的机会能复用连接呢? 我们的担心其实是多余的只有在
  • RealConnection还有可分配的Stream。对于HTTP或HTTPS而言不能同时在楿同的连接上执行多个请求。即使对于HTTP/2而言StreamID的空间也是有限的,同一个连接上的StreamID总有分配完的时候而在StreamID被分配完了之后,该连接就不能再被使用了

方法,相关的组件之间的关系大体如下图:

本文来自网易实践者社区经作者韩鹏飞授权发布。

}

我要回帖

更多关于 java连接池用哪个 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信