【问题标题】:Counting Bytes sent/received over HTTP计算通过 HTTP 发送/接收的字节数
【发布时间】:2009-09-18 23:44:51
【问题描述】:

在 Java 中,
如何计算通过活动 HTTP 连接发送和接收的字节数?
我想显示一些统计数据,例如:

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

【问题讨论】:

  • 你使用的是什么机制? HttpURL连接?您需要接收/发送的字节来包含标头还是仅包含正文?
  • 实际上,我实际上想在 Java ME 中执行此操作,但我没有收到任何答案,因此我修改了 Java SE 的问题,认为我可以以某种方式解决。那么JavaME有HttpConnection接口java.sun.com/javame/reference/apis/jsr118
  • 我想包括所有字节,因为我根据通过网络发送和接收的字节计算成本。

标签: java http byte counter


【解决方案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 的详细信息,以确保结果的准确性。

【讨论】:

    【解决方案2】:

    将 HTTPURLConnection 的 getInputStream() 和 getOutputStream() 包装在您自己的流中,以计算通过它们的字节数。或者甚至更好地使用 Apache Commons IO 库 - 他们在那里有计数流实现。

    【讨论】:

    • 读取输入输出流不会计算 HEADER 长度。计数将始终小于原始计数。而是应该看到 WIRESHARK 中 http 连接中使用的字节(用于采样)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多