2015-09-17 6 views
3

Я бы хотел проверить функцию http2 okhttp. И я делаю несколько запросов на один и тот же хост в асинхронном стиле. Но я обнаружил, что это связано с несколькими соединениями, поскольку протокол h2, он должен использовать только одно соединение, верно? Код ниже. Ах, я использую okhttp2.5При использовании http2 в okhttp, почему несколько запросов к одному и тому же хосту не использовали только один connectoin

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(); 
    } 
} 
+0

Пожалуйста, объясните, как вы знаете, что ваши запросы проходят через несколько соединений. – dsign

+0

Я получаю заключение по следующим причинам: 1. при изменении диспетчера ** maxRequestsPerHost ** результат изменяется соответствующим образом, поэтому я использую путь/delay/1 для теста. ** maxRequestsPerHost ** означает количество подключений или просто количество запросов, несмотря на то, что несколько запросов могут быть выполнены только в одном соединении? ; 2. Я сравниваю производительность с HTTP1.1 с использованием другого пути, например/get, кажется, что нет различий в производительности, независимо от того, сколько запросов я задал. –

+0

Можете ли вы подтвердить, что получаете соединение HTTP/2? Обратите внимание, что вам понадобится Jetty-ALPN на рабочем столе. –

ответ

0

Там находится в OkHttp a bug, где несколько одновременных запросов каждый создавать свои собственные сокет-соединение, а не координируя общую связь. Это происходит только при одновременном создании соединений. Работайте, получив 500 мс до 2-го соединения.

+0

Если эта ошибка существует, это означает, что во многих случаях мое приложение не будет использовать мультиплексированные функции HTTP/2, верно? Потому что, если я хочу подождать 500 мс для создания 2-го соединения, возможно, достаточно использовать HTTP1.1. И я делаю эксперимент, добавляя 'Thread.sleep (1000)' после 'client.newCall (reqeust) .enqueue', кажется, всегда использует несколько соединений, как раньше. –

+0

Правильно ли ссылка на ошибку? Я не думаю, что это имеет отношение к этой проблеме. Ваше описание ошибки связано, однако, я не могу обойти это, используя сон. В ожидании вашей помощи, THX ~ –