OkHttp не мультиплексирует SPDY соединения на Android 4.4.2

Я пытаюсь провести эксперимент на Android и SPDY, используя OkHttp. Тем не менее, я не могу получить мультиплексную функцию SPDY на моем телефоне Android. Ниже мой код.

private static final long WAIT_TIME = 1000 * 2; // Wait 2 seconds between each connection.
private static final long SIZE = 1000 * 1000 * 5; // Size of the content requested.

private static final String LOC = Environment.getExternalStorageDirectory().getPath();

private final static OkHttpClient mClient;
private final static OkUrlFactory mFactory;

static {
    mClient = new OkHttpClient();
    mClient.setConnectTimeout(5 * 60, TimeUnit.SECONDS);
    mClient.setFollowRedirects(false);
    mClient.setFollowSslRedirects(false);
    mClient.setProxy(Proxy.NO_PROXY);
    //mClient.setRetryOnConnectionFailure(false);
    mFactory = new OkUrlFactory(mClient);
}

private void startOkHttp() {

    for (int i = 0; i < 10; i++) {
        final int idx = i;
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println(idx);
                try {
                    testOkHttpClient(LOC + "/" + idx);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
        try {
            Thread.sleep(WAIT_TIME);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.start();
    }
}

private void testOkHttpClient(String fileLoc) throws IOException {

    System.out.println("Multiplexing connections: " + ConnectionPool.getDefault().getMultiplexedConnectionCount());
    System.out.println("getConnectionCount: " + ConnectionPool.getDefault().getConnectionCount());
    System.out.println("getHttpConnectionCount: " + ConnectionPool.getDefault().getHttpConnectionCount());
    System.out.println("getSpdyConnectionCount: " + ConnectionPool.getDefault().getSpdyConnectionCount());
    Request request = new Request.Builder()
            .url("https://the same url for all the connections")
            .addHeader("Accept-Encoding", "gzip")
            .addHeader("User-Agent", "com.google.android.youtube/10.05.6(Linux; U; Android 4.4.2; en_US; Nexus 5 Build/KOT49H)")
            .addHeader("Range", "bytes=0-" + SIZE)
            .addHeader("Connection", "keep-alive")
            .build();

    Response response = mClient.newCall(request).execute();

    System.out.println("Status: " + response.code());

    InputStream is = response.body().byteStream();
    File file = new File(fileLoc);
    if (!file.exists()) {
        file.createNewFile();
    }
    FileOutputStream fos = new FileOutputStream(file);
    ChannelUtils.fastChannelCopy(is, fos);
    fos.close();
}

По сути, он инициирует HTTP-метод GET для одного и того же URL (видео) каждые 2 секунды. То, что я ожидал, было одним соединением HTTPS, и все 10 соединений были мультиплексированы в нем. Тем не менее, я обнаружил, что с помощью wireshark существует 10 подключений к одному IP-адресу. Хорошо, что Wireshark сообщает мне, что каждое соединение использует SPDY.

Wireshark выход:

Уровень записи TLSv1.2: протокол данных приложения: spdy

Соединения HTTPS не используются повторно, так как все соединения начались до завершения какой-либо загрузки, что является разумным.

Другое дело, все getMultiplexedConnectionCount(), getConnectionCount(), getHttpConnectionCount(), getSpdyConnectionCount() дают мне 0, Я так растерялся по этому поводу. Как я читаю на главной странице охттп, он должен поддерживать SPDY с мультиплексированием. Может кто-нибудь сказать мне, что я сделал не так с кодом? Или кто-нибудь может указать любую другую библиотеку, которую я могу использовать для мультиплексирования SPDY на Android?

Спасибо всем за чтение этого!

Обновление: я использую телефон Android с Android 4.4.2, okhttp-2.2.0.

Обновление 2response.protocol() возвращает меня http/1.1, что отличается от того, что я нашел в Wireshark.

Контрольный вопрос:

С помощью приведенного выше кода я успешно подключился к https://www.google.ca и получить spdy/3.1 с response.protocol(), который показывает, что alpn работает нормально. Однако, когда я попытался подключиться к сайтам с поддержкой http/2, таким как https://h2duo.trafficmanager.net/ (это общедоступный тестовый веб-сайт http/2), я всегда получаю http/1.1не http/2 или что-то с использованием приведенного выше кода. В хроме я вижу что h2duo.cloudapp.net:443 с Protocol Negotiated:h2-14, Я могу видеть из кода Ohttp, что у меня есть h2-16 как один из выходных (OkHttpClient)mClient.getProtocols(),

Так почему я не могу подключиться к https://h2duo.trafficmanager.net/ с http/2?

0 ответов

Другие вопросы по тегам