【问题标题】:URLConnection low level byte countingURLConnection 低级字节计数
【发布时间】:2016-02-09 07:47:49
【问题描述】:

我正在尝试使用URLConnection 获得最低级别的字节计数。我已经用来自 Apache Commons IO 的 CountingInputStreamCountingOutputStream 计算了通过两个流传递的数据,但是我得到的字节数等于我发送的正文大小 + 我的响应正文大小收到回来。

在 HttpClient 中,我有一个 MeasuringClientConnManager,我认为这是一个更底层的字节计数。

为了获得最准确的值,我将使用 TrafficStats 将这些库的计数与这些方法进行比较:

public static long getCurrentRx(Context context){
    int uid = context.getApplicationInfo().uid;
    return TrafficStats.getUidRxBytes(uid);
}

public static long getCurrentTx(Context context){
    int uid = context.getApplicationInfo().uid;
    return TrafficStats.getUidTxBytes(uid);
}

public static long getCurrentNetworkUsage(Context context){
    return getCurrentRx(context) + getCurrentTx(context);
}
public static long getDiffNetworkUsage(Context context, long previousNetworkUsage){
    return getCurrentNetworkUsage(context) - previousNetworkUsage;
}

使用这些方法,我通过 HttpClient 获得了比 URLConnection 更接近的值。

两个问题:

  1. 怎么会出现 URLConnection,我在 OutputStream 上没有看到一些字节大小指示标头已发送?我怎么只看到身体大小?标题在哪里?网址调用? DNS 解析字节?

  2. 有没有办法测量对 URLConnection 库的调用在网络接口上发送的每个字节?等级越低越好!

【问题讨论】:

    标签: java android apache io network-programming


    【解决方案1】:

    URLConnection 旨在抽象出标题的读取(和写入)。该类的输入和输出流只代表主体;有一些特定的例程可以处理标题,因此不必直接编写。

    如果您深入了解 Sun/Oracle JRE,您会发现他们的 HttpURLConnection 实现使用的是他们自己的 HTTP 客户端版本。该客户端正在对整个内容进行完整的读取和写入。

    您也许可以编写自己的 URLConnection 实现来模仿 Sun/Oracle(和 Apache)正在做的事情,但同时跟踪读取/写入的字节数。不过我敢打赌这有点复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2012-12-15
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多