android TrafficStats getUidRxBytes不正确

android TrafficStats getUidRxBytes不正确,第1张

概述我写了一个小小的android应用程序,发送Http请求,从服务器接收响应,并计算了发送和接收的字节数.代码简单如下longreceivedBytes=TrafficStats.getUidRxBytes(uid)-lastNumer我发现,receivedBytes总是大于httpHeaderhttpBody的大小,例如我在服务器中捕获到的实际http帧大

我写了一个小小的android应用程序,发送http请求,从服务器接收响应,并计算了发送和接收的字节数.
代码简单如下

long receivedBytes = TrafficStats.getUIDRxBytes(uID)-lastNumer

我发现,receivedBytes总是大于http header http Body的大小,例如
我在服务器中捕获到的实际http帧大小(使用wireshark)为1645字节(标头主体),但androID API返回的receiveBytes为1912,以便进行传输.

TrafficStats getUIDRxBytes本身是不准确的(可能是这个问题特定于我的带有cynogenmod 10.3的平台i9300)

最后,我找到了计算数据使用量的正确方法,也找到了其他方法来计算数据使用量,这似乎比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之后,在这里结束自己).

API documentation指出:

Statistics are measured at the network layer, so they include both TCP and UDP usage.

该文档的确可以更加详尽,但是我倾向于说,可以假定返回的字节数也包括组成传输层头和网络层头的字节.

HTTP is an application layer protocol.在计算期望的字节数为http标头字节加http正文字节时,您仅处理应用程序层字节,因此不考虑传输和网络层标头字节.我假设使用TCP进行下载. This adds a header ranging from 20 to 60 bytes.此外,假设您正在使用IPv4进行下载. This also adds a header ranging from 20 to 60 bytes.

显然,这并不能说明整个1912年-1645年= 267个字节,但它可能会给您/其他人带来一些帮助.

有点题外话,但仍然相关.尚不清楚TrafficStats API是否实际计算标头字节.根据this answer,API不计算标头字节.但是,鉴于上面列出的api文档,链接的答案可能规定了不正确的内容(至少不是针对API级别21的情况).此外,this question还暗示TrafficStats实际在计算网络和传输层标头字节(检查注释).

TrafficStats实际上计算网络和传输层标头字节.参见kernel source和TrafficStatsTest.

总结

以上是内存溢出为你收集整理的android TrafficStats getUidRxBytes不正确全部内容,希望文章能够帮你解决android TrafficStats getUidRxBytes不正确所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1088202.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存