Подсчет байтов, отправленных / полученных по HTTP - PullRequest
1 голос
/ 19 сентября 2009

В Java
Как можно посчитать байты, отправленные и полученные по активному HTTP-соединению?
Я хочу отобразить некоторые статистические данные, такие как:

Bytes Sent     : xxxx Kb   
Bytes Received : xxxx Kb  
Duration       : hh:mm

Ответы [ 2 ]

1 голос
/ 21 сентября 2009

Сложно увидеть, как можно украсить 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 , чтобы обеспечить точность ваших результатов.

1 голос
/ 19 сентября 2009

Оберните HTTPURLConnection getInputStream () и getOutputStream () в ваши собственные потоки, которые считают байты, проходящие через них Или, что еще лучше, используйте библиотеку Apache Commons IO - там есть реализация потоковых подсчетов.

...