2009-09-18 98 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

相关问题