如何在okhttp3中为http2.0和async使用相同的TCP连接?

问题描述 投票:1回答:1

https://github.com/square/okhttp/issues/6051移动

这是okhttp keepalived连接的问题,我想知道如何处理此问题。

OkHttpClient httpClient = new OkHttpClient.Builder()
                .sslSocketFactory(factory, (X509TrustManager) TRUST_MANAGERS[0])
                .hostnameVerifier((s, sslSession) -> true)
                .protocols(Arrays.asList(Protocol.HTTP_2, Protocol.HTTP_1_1))
                .retryOnConnectionFailure(true)
                .connectionPool(new ConnectionPool(5, 60, TimeUnit.SECONDS))
                .build();

Request request = new Request.Builder()
                .url("https://example.com/")
                .build();

int count = 2;

long startTime = System.currentTimeMillis();

final CountDownLatch countDownLatch = new CountDownLatch(count);

for (int i = 1; i <= count; ++i) {
    httpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    System.out.println(Thread.currentThread().getName() + "-failed-" + e.getMessage());
                    finish();
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    finish();
                }

                private void finish() {
                    countDownLatch.countDown();
                }

            });

    }

        countDownLatch.await();

        System.out.println("Time: " + (System.currentTimeMillis() - startTime) );

        System.exit(0);

}
okhttp
1个回答
0
投票

如果想了解发生了什么,请使用LoggingEventListener。

[通常,当我们第一次连接时,我们无法提前知道单个连接将是http / 2并且能够满足这两个请求。因此,当连接池为空时,OkHttp将建立2个连接,发现它们都是http / 2,然后断开其中之一。

很可能两个请求都使用一个连接,但是您看到两个建立的连接。

您有几个选择

1)不用担心,让它临时创建两个连接,并且OkHttp一旦意识到它具有两个HTTP / 2连接,就会关闭一个连接。

2)使用热身请求创建第一个请求,然后仅在收到第一个请求的connectionAcquired事件后,才向同一主机创建辅助请求。

但是我鼓励您不要担心,只要让OkHttp来完成就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.