Comptage des octets envoyés / reçus via HTTP
Question
En Java,
Comment compter les octets envoyés et reçus via une connexion HTTP active?
Je souhaite afficher des statistiques telles que:
Bytes Sent : xxxx Kb
Bytes Received : xxxx Kb
Duration : hh:mm
La solution
Il est difficile de voir comment décorer HttpConnection pour compter les données brutes en octets. Vous pouvez réimplémenter HTTP en utilisant des sockets, mais cela doit être assez important pour aller à ces longueurs.
Exemple de réponse de 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....
Les requêtes HTTP sont relativement simples, vous pouvez donc essayer de les reconstruire en utilisant les informations exposées. Quelque chose de la forme:
// 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);
Cette implémentation est incomplète et non testée. Vous devez étudier les détails du protocole HTTP pour garantir l'exactitude de vos résultats.
Autres conseils
Enveloppez les méthodes getInputStream () et getOutputStream () de HTTPURLConnection dans vos propres flux qui comptent les octets qui les traversent. Ou encore mieux, utilisez la bibliothèque Apache Commons IO: ils contiennent des implémentations de flux de comptage.