Intereting Posts
Убедитесь, что имя класса существует, является общедоступным и имеет пустой конструктор для общедоступного фрагмента с именем класса и пустым конструктором Сохранение на SD-карту в виде текстового файла Знайте, когда ротация завершена с помощью setRequestedOrientation Использование опции Java build useLegacyMergeSort = true с градиентом android Как сделать текст подходящим для экрана (текстовое обертывание) в WebView с помощью KitKat Мобильное приложение: как показать OTP мое приложение отправляет всплывающее окно, не выходя из моего приложения? Съемка с пользовательской камеры растягивается при сохранении в ImageView Событие OnKeyUp в браузере Android для неязыковых языков Невозможно избавиться от нижней прокладки на кнопке Как перемещать изображения снизу вверх непрерывно? Как добавить теги в XML на Android? Странное поведение в инструкции do / while на Galaxy S5 и Android 5.1.1 Анимированное население RecyclerView ClassNotFoundException чтение объекта Serializable в классе, расширяющем MapFragment в onSaveInstanceState Написать c # реализацию абстрактного класса inline?

Подсчет байтов низкого уровня 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 отправлялся по сетевому интерфейсу? Самый низкий уровень, тем лучше!

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

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

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