在okhttp中使用http2时,为什么对同一主机的多个请求不使用一个connectoin

时间:2015-09-17 07:46:32

标签: okhttp http2

我想测试okhttp的http2功能。我以异步方式对同一主机进行多次请求。但是,我发现,它涉及多个连接,因为协议是h2,它应该只使用一个连接,对吧? 代码如下。 啊,我正在使用okhttp2.5

public class Performance {
    private final OkHttpClient client = new OkHttpClient();
    private final Dispatcher dispatcher = new Dispatcher();
    private final int times = 20;

    public Performance(){
        dispatcher.setMaxRequestsPerHost(2);
        client.setDispatcher(dispatcher);

        // Configure the sslContext
        // MySSLSocketFactory mySSLSocketFactory = new MySSLSocketFactory();
        // client.setSslSocketFactory(mySSLSocketFactory);
        // client.setHostnameVerifier(new HostnameVerifier() {
        //     public boolean verify(String s, SSLSession sslSession) {
        //         return true;
        //     }
        // });
    }
    public void run()throws Exception{
        for(int i=0; i<times; i++) {
            Request request = new Request.Builder()
                .url("https://http2bin.org/delay/1")
                .build();
            client.newCall(request).enqueue(new Callback() {
                public void onFailure(Request request, IOException e) {
                    e.printStackTrace();
                }

                public void onResponse(Response response) throws IOException {
                    System.out.println(response.headers().get("OkHttp-Selected-Protocol"));
                }
            });
        }
    }
    public static void main(String[] args)throws Exception{
        Performance performance = new Performance();
        performance.run();
    }
}

1 个答案:

答案 0 :(得分:0)

OkHttp中有a bug,其中多个并发请求各自创建自己的套接字连接,而不是协调共享连接。这仅在同时创建连接时发生。在第二次连接之前通过产生500ms来解决。