Intereting Posts
Структура ресурсов в Apache Cordova (PhoneGap) и загрузка файлов из файловой системы Завершите старую активность и запустите новую или наоборот Help debugging thread (AsyncTask) RuntimeException причина в Android / Eclipse Как установить местоположение по умолчанию и уровень масштабирования для google map api v2? Как вводить зависимости в любой объект с помощью Dagger2? Фильтр Intent для обычных файловых исследователей Android: получение количества видимых детей в списке Получить предложенное имя файла из org.apache.http.HttpResponse Использовать RxAndroid или RxKotlin при программировании в Kotlin для Android? Перенос ByteArray через Parcel возвращает NullPointerException Java сортирует массив месяцев в несколько массивов по месяцам Как читать штрих-коды с камерой на Android? Android: невозможно загрузить библиотеку (94 пропавших основных таблиц) Есть ли способ отключить анимацию Android ListView? Android-веб-просмотр, файловый файл filechooser не отображается

Подсчет байтов низкого уровня URLConnection

Я пытаюсь получить самый низкий уровень подсчета байтов с помощью URLConnection . Я уже пошел, чтобы подсчитать данные, проходящие через два потока: CountingInputStream и CountingOutputStream из Apache Commons IO, но подсчет байтов, который я получаю, равен размеру тела, которое я отправляю + размер тела ответа, который я получаю.

В HttpClient у меня был MeasuringClientConnManager с тем, что, как я полагаю, является более низким байт-счетчиком.

Чтобы получить наиболее точное значение, я сравниваю подсчет этих библиотек с этими методами, используя TrafficStats :

public static long getCurrentRx(Context context){ int uid = context.getApplicationInfo().uid; return TrafficStats.getUidRxBytes(uid); } public static long getCurrentTx(Context context){ int uid = context.getApplicationInfo().uid; return TrafficStats.getUidTxBytes(uid); } public static long getCurrentNetworkUsage(Context context){ return getCurrentRx(context) + getCurrentTx(context); } public static long getDiffNetworkUsage(Context context, long previousNetworkUsage){ return getCurrentNetworkUsage(context) - previousNetworkUsage; } 

Используя эти методы, я получил гораздо более близкие значения с HttpClient, чем URLConnection.

Два вопроса:

  1. Почему на URLConnection я не вижу на индикаторе размерного байта OutputStream заголовки отправляются? Почему я вижу там только размер тела? Где заголовки? Телефонный звонок? Разрешающие байты DNS?

  2. Есть ли способ измерить каждый байт, чтобы вызов библиотеки URLConnection отправлялся по сетевому интерфейсу? Самый низкий уровень, тем лучше!

Solutions Collecting From Web of "Подсчет байтов низкого уровня URLConnection"

URLConnection предназначен для абстрагирования чтения (и записи) заголовков. Входные и выходные потоки этого класса представляют только тело; Существуют специальные процедуры для манипулирования заголовками, чтобы их не нужно было писать напрямую.

Если вы посмотрите под капотом в Sun / Oracle JRE, вы увидите, что их реализация HttpURLConnection использует собственную версию HTTP-клиента. Этот клиент делает полное чтение и запись всего контента.

Возможно, вы сможете написать собственную реализацию URLConnection, которая имитирует действия Sun / Oracle (и Apache), но в то же время отслеживает количество прочитанных / записанных байтов. Тем не менее, я утверждаю, что это немного сложно.