android TrafficStats getUidRxBytes不正确

 桐街库_509 发布于 2022-12-26 11:08

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

long receivedBytes = TrafficStats.getUidRxBytes(uid)-lastNumer

我发现ReceivedBytes总是大于http Header + http Body,例如我在服务器中捕获(使用wireshark)的实际http帧大小为1645 bytes(header + body),但是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;
}

Janus Varmar.. 5

我发现您已经找到了解决方案,但我会在您的问题上加贴我的想法,因为它可能对其他人有用(在谷歌搜索如何使用TrafficStats API之后,在这里结束自己)。

该API文档状态:

统计信息是在网络层进行测量的,因此它们包括TCP和UDP使用情况。

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

HTTP是应用程序层协议。在计算期望的字节数为HTTP标头字节加上HTTP正文字节时,您只处理应用程序层字节,因此不考虑传输和网络层标头字节。我假设使用TCP进行下载。这将添加一个20到60个字节的标头。此外,假设您正在使用IPv4进行下载。这还会添加一个20到60个字节的标头。

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


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


TrafficStats实际上计算网络和传输层标头字节。请参阅内核源代码和TrafficStatsTest。

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有