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
?