在 Java 中,
如何计算通过活动 HTTP 连接发送和接收的字节数?
我想显示一些统计信息,例如:
Bytes Sent : xxxx Kb
Bytes Received : xxxx Kb
Duration : hh:mm
很难看出如何装饰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 协议的细节以确保结果的准确性。
将 HTTPURLConnection 的 getInputStream() 和 getOutputStream() 包装在您自己的流中,以计算通过它们的字节数。或者甚至更好地使用 Apache Commons IO 库 - 他们在那里有计数流实现。