2009-09-18 83 views
1

在Java中,
如何計算通過活動HTTP連接發送和接收的字節數?
我想顯示像一些統計數據:計數通過HTTP發送/接收的字節數

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

你使用什麼機制? HttpURLConnection的?你是否需要接收/發送的字節包含標題或僅包含正文? – McDowell 2009-09-19 17:50:57

+0

其實,我真的想在Java ME中做到這一點,但我沒有收到任何答案,所以我修改了我的Java SE問題,以爲我可以以某種方式解決問題。那麼JavaME有HttpConnection接口http://java.sun.com/javame/reference/apis/jsr118/ – 2009-09-19 17:57:30

+0

我想包括所有的字節,因爲我計算成本取決於通過網絡發送和接收的字節。 – 2009-09-19 17:59:09

回答

1

很難看出你如何裝飾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 protocol的詳細信息,以確保結果的準確性。

1

裹HttpURLConnection的的getInputStream()和getOutputStream方法()在自己的流表示,計數,通過他們去的字節數。或者甚至更好地使用Apache Commons IO庫 - 他們在那裏計數流實現。

+0

reading輸入輸出流不會計算HEADER長度。數量總是比原來少。而應該看到WIRESHARK中http連接使用的字節(用於採樣) – 2011-12-08 09:10:55

相關問題