Подсчет байтов, отправленных / полученных по HTTP
Вопрос
В Java,
Как можно посчитать байты, отправленные и полученные через активное соединение HTTP?
Я хочу отобразить некоторые статистические данные, такие как:
Bytes Sent : xxxx Kb
Bytes Received : xxxx Kb
Duration : hh:mm
Решение
Трудно понять, как можно украсить HttpConnection для подсчета необработанных байтовых данных. Вы можете переопределить HTTP, используя сокеты, но это должно быть очень важно, чтобы пойти на это.
Пример ответа от stackoverflow.com
:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Expires: Mon, 21 Sep 2009 11:46:48 GMT
Vary: Accept-Encoding
Server: Microsoft-IIS/7.0
Date: Mon, 21 Sep 2009 11:46:48 GMT
Content-Length: 19452
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>...remaining data....
HTTP-запросы достаточно просты, поэтому вы можете попытаться восстановить его, используя предоставленную информацию. Что-то в форме:
// TODO: edge cases, error handling, header delimiter, etc.
int byteCount = 0;
int headerIndex = 0;
while (true) {
String key = httpConnection.getHeaderFieldKey(headerIndex);
if (key == null)
break;
String value = httpConnection.getHeaderField(headerIndex++);
byteCount += key.getBytes("US-ASCII").length
+ value.getBytes("US-ASCII").length + 2;
}
byteCount += httpConnection.getHeaderFieldInt("Content-Length",
Integer.MIN_VALUE);
Эта реализация является неполной и непроверенной. Вам нужно изучить детали HTTP-протокола , чтобы убедиться в точности ваших результаты. р>
Другие советы
Оберните getInputStream () и getOutputStream () HTTPURLConnection в ваши собственные потоки, которые подсчитывают проходящие через них байты. Или, что еще лучше, используйте библиотеку Apache Commons IO - там есть реализация потоковых подсчетов.