我编写了一个小 Android 应用程序,发送 Http 请求,接收来自服务器的响应,并计算传输和接收的字节数。
代码如下
long receivedBytes = TrafficStats.getUidRxBytes(uid)-lastNumer
我发现收到的字节总是大于 http Header+http Body 的大小,例如
我在服务器中捕获的实际http帧大小(使用wireshark)是1645字节(标头+正文),但android API返回receivedBytes是1912,传输也是如此。
TrafficStats getUidRxBytes 本身不准确(可能这个问题特定于我的平台 samsung i9300 with cynogenmod 10.3)
最后,我找到了计算数据使用量的正确方法,我找到了其他方法来计算数据使用量,这似乎比 TrafficStats API 更准确。(非常感谢here)
private long[] getStat() {
String line, line2;
long[] stats = new long[2];
try {
File fileSnd = new File("/proc/uid_stat/"+uid+"/tcp_snd");
File fileRcv = new File ("/proc/uid_stat/"+uid+"/tcp_rcv");
BufferedReader br1 = new BufferedReader(new FileReader(fileSnd));
BufferedReader br2 = new BufferedReader(new FileReader(fileRcv));
while ((line = br1.readLine()) != null&& (line2 = br2.readLine()) != null) {
stats[0] = Long.parseLong(line);
stats[1] = Long.parseLong(line2);
}
br1.close();
br2.close();
} catch (Exception e) {
e.printStackTrace();
}
return stats;
}
我看到您已经找到了解决方案,但我会添加我对您的问题的想法,因为它可能对其他人有用(在谷歌搜索如何使用 TrafficStats API 后我自己就到了这里)。
The API文档状态:
统计数据是在网络层测量的,因此它们包括 TCP 和 UDP 使用情况。
该文档确实可以更详尽,但我倾向于说人们可以假设返回的字节数还包括组成传输层标头和网络层标头的字节.
HTTP是应用层协议。当您计算预期字节为 HTTP 标头字节加上 HTTP 正文字节时,您仅处理应用程序层字节,因此不考虑传输层和网络层标头字节。我假设 TCP 用于下载。这会添加一个 20 到 60 字节的标头。此外,假设您使用 IPv4 进行下载。这还添加了一个 20 到 60 字节的标头.
显然,这并不能解释整个 1912 - 1645 = 267 字节,但它可能会给你/其他人一些线索。
有点偏离主题,但仍然相关。目前尚不清楚 TrafficStats API 是否确实计算标头字节数。根据这个答案,API 确实not计算标头字节数。然而,鉴于上面列出的 API 文档,链接的答案可能规定了一些不正确的内容(至少对于 API 级别 21 而言)。而且,这个问题还暗示 TrafficStats 实际上计算网络和传输层标头字节(检查注释)。
TrafficStats 实际上计算网络和传输层标头字节数。看内核源代码 and 交通统计测试.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)