Android开发经验谈Android技术知识Android开发

okhttp之StreamAllocation

2019-10-08  本文已影响0人  103style

转载请以链接形式标明出处:
本文出自:103style的博客


base on 3.12.0


目录


背景

HTTP 的版本从最初的 1.0版本,到后续的 1.1版本,再到后续的 google 推出的SPDY,后来再推出 2.0版本,HTTP协议越来越完善。okhttp也是根据2.0和1.1/1.0作为区分,实现了两种连接机制.

http2.0解决了老版本(1.1和1.0)最重要两个问题:

http2.0 使用 多路复用 的技术,多个 stream 可以共用一个 socket 连接。每个 tcp连接都是通过一个 socket 来完成的,socket 对应一个 hostport,如果有多个stream(即多个 Request) 都是连接在一个 hostport上,那么它们就可以共同使用同一个 socket ,这样做的好处就是 可以减少TCP的一个三次握手的时间
OKHttp里面,负责连接的是 RealConnection


简介

官方注释是 StreamAllocation是用来协调ConnectionsStreamsCalls这三个实体的。

HTTP通信 执行 网络请求Call 需要在 连接Connection 上建立一个新的 Stream,我们将 StreamAllocation 称之 的桥梁,它负责为一次 请求 寻找 连接 并建立 ,从而完成远程通信。

然后我们先来看看 StreamAllocation 这个类是在什么地方初始化的,以及在哪些地方用到?

选中StreamAllocation 的构造方法,在 AndroidStudio 中按 Alt + F7,我们发现是在 RetryAndFollowUpInterceptor这个拦截器intercept(Chain chain)中创建的.
然后往下层拦截器传递,直到 ConnectInterceptor 以及 CallServerInterceptor才继续用到。

public final class RetryAndFollowUpInterceptor implements Interceptor {
    ...
  @Override public Response intercept(Chain chain) throws IOException {
    ...
    StreamAllocation streamAllocation = new StreamAllocation(client.connectionPool(),
        createAddress(request.url()), call, eventListener, callStackTrace);
    ...
}
public final class ConnectInterceptor implements Interceptor {
  ...
  @Override public Response intercept(Chain chain) throws IOException {
    ...
    HttpCodec httpCodec = streamAllocation.newStream(client, chain, doExtensiveHealthChecks);
    RealConnection connection = streamAllocation.connection();
    return realChain.proceed(request, streamAllocation, httpCodec, connection);
  }
}
public final class CallServerInterceptor implements Interceptor {
  ...
  @Override public Response intercept(Chain chain) throws IOException {
    ...
        streamAllocation.noNewStreams();
    ...
  }
 ...
}

StreamAllocation 的成员变量


StreamAllocation 的构造函数

RetryAndFollowUpInterceptor 中传入了 :

public StreamAllocation(ConnectionPool connectionPool, Address address, Call call,
                        EventListener eventListener, Object callStackTrace) {
    this.connectionPool = connectionPool;
    this.address = address;
    this.call = call;
    this.eventListener = eventListener;
    this.routeSelector = new RouteSelector(address, routeDatabase(), call, eventListener);
    this.callStackTrace = callStackTrace;
}

StreamAllocation 的相关方法

我们在简介中介绍 StreamAllocation 在哪里创建的时候,发现拦截器中主要调用的就是 newStream(...)noNewStreams() 这两个方法。那我们先来看看这两个方法吧。

继续看下 newStream(...) 获取可用连接的流程。


小结


参考文章

如果觉得不错的话,请帮忙点个赞。

以上

上一篇 下一篇

猜你喜欢

热点阅读