2009-09-18 9 views
1

En Java,
Comment les octets envoyés et reçus via une connexion HTTP active peuvent-ils être comptés?
Je veux afficher quelques statistiques comme:Comptage des octets envoyés/reçus via HTTP

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

Quel mécanisme utilisez-vous? HttpURLConnection? Et avez-vous besoin des octets reçus/envoyés pour inclure les en-têtes ou seulement le corps? – McDowell

+0

En fait, je veux vraiment faire cela en Java ME, mais je n'ai pas reçu de réponse pour cela, j'ai donc modifié ma question pour Java SE pensant que je pouvais en quelque sorte contourner le problème. Eh bien JavaME a l'interface HttpConnection http://java.sun.com/javame/reference/apis/jsr118/ –

+0

Je voudrais inclure tous les octets parce que je calcule le coût en fonction des octets envoyés et reçus sur le réseau. –

Répondre

1

Il est difficile de voir comment vous pouvez décorer HttpConnection pour compter les données d'octets brutes. Vous pouvez réimplémenter HTTP en utilisant des sockets, mais cela devrait ê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.... 

requêtes HTTP sont raisonnablement simples, vous pouvez essayer de le reconstruire en utilisant les informations qui sont 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 auriez besoin d'étudier les détails de la HTTP protocol pour assurer l'exactitude de vos résultats.

1

Wrap getInputStream() et getOutputStream() de la HttpURLConnection dans vos propres flux qui compte les octets qui passent par eux. Ou mieux encore, utilisez la librairie Apache Commons IO - ils ont des implémentations de flux en compte.

+0

lecture Le flux de sortie d'entrée ne compte pas la longueur de l'EN-TETE. Le nombre sera toujours inférieur à l'original. Plutôt on devrait voir les octets utilisés dans la connexion http dans WIRESHARK (pour l'échantillonnage) –

Questions connexes