【问题标题】:using http2 with okhttp in android, why 20 stream is created for 20 request在android中使用http2和okhttp,为什么为20个请求创建20个流
【发布时间】:2017-12-02 15:03:48
【问题描述】:

使用okhttp 3.8.1

我使用 okhttp http2 使用具有相同 okhttpclient 的多个线程同时请求 20 张相同的图片。

我使用 tcp dump 来捕获流量。发现还有 20 个 tcp 流,其中一个大得多,另外 19 个小一些。

我的问题是这 19 个流的用途。还是我以错误的方式使用 ok http?

    up      down    count 
    2510    56320   1
    352     3492    19

我的代码是这样的

    OkHttpClient client = builder.build();
    for (int i = 0; i < urls.length; i++) {
        runTest(urls[i], client);
        }
...
    private void runTest(...)
        new Thread(new Runnable() {
                @Override
                public void run() {
                        Request request = new Request.Builder()
                                .url(url)
                                .build();
                        try {
                            Response response = client.newCall(request).execute();
                            result = response.body().string();
                        } catch (IOException e) {
                        }
                    }
                }
            }).start();
    }

【问题讨论】:

  • 你能想到“runTest(urls[i], client);”结果?
  • @Sree 我记得 okhttp 建议对不同的请求使用相同的客户端?没有?
  • @Sree 对不起,还是没明白你的意思。但是 OkHttpClient 的文档说“应该共享 OkHttpClients OkHttp 在您创建单个 OkHttpClient 实例并将其重用于所有 HTTP 调用时性能最佳。”
  • 我只能在这里猜测,您可以通过查看 tcp 转储来验证这一点。一个连接实际加载图像,其他连接只会检查缓存的版本是否仍然是最新的。

标签: android okhttp http2


【解决方案1】:

答案就在https://github.com/square/okhttp/issues/3442这里的讨论中

简而言之,当并发请求开始时,还没有可用的 tcp 通道,所以 okhttp 为每个请求创建新的 tcp 通道(20)。第一个建立后,通过合并机制,其他请求将放弃它创建的 tcp 通道并使用第一个建立的通道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 2011-05-28
    • 2023-01-28
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    相关资源
    最近更新 更多