Java URLConnection低级字节计数

Java URLConnection低级字节计数,java,android,apache,io,network-programming,Java,Android,Apache,Io,Network Programming,我正在尝试使用尽可能低的字节计数级别。我已经开始计算通过两个流的数据,包括Apache Commons IO和来自Apache Commons IO的数据,但是我得到的字节计数等于我发送的正文大小+我接收的响应正文大小 在HttpClient中,我使用了一个我认为是更低级的字节计数 为了获得最精确的值,我将使用以下方法比较这些库的计数与这些方法: 使用这些方法,我通过HttpClient获得了比URLConnection更接近的值 两个问题: 为什么在URLConnection上,我没有在Out

我正在尝试使用尽可能低的字节计数级别。我已经开始计算通过两个流的数据,包括Apache Commons IO和来自Apache Commons IO的数据,但是我得到的字节计数等于我发送的正文大小+我接收的响应正文大小

在HttpClient中,我使用了一个我认为是更低级的字节计数

为了获得最精确的值,我将使用以下方法比较这些库的计数与这些方法:

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

两个问题:

  • 为什么在URLConnection上,我没有在OutputStream上看到一些字节大小的指示头被发送?为什么我只看到身体的尺寸?标题在哪里?url调用?DNS解析字节数

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


  • URLConnection设计用于抽象出头的读取(和写入)。该类的输入和输出流仅代表主体;有一些特定的例程用于处理头文件,这样就不必直接写入头文件

    如果您在Sun/OracleJRE中仔细观察,您会发现他们的HttpURLConnection实现使用的是他们自己版本的HTTP客户端。该客户正在对整个内容进行完整的读写

    您可以编写自己的URLConnection实现,模仿Sun/Oracle(和Apache)的做法,但同时跟踪读/写的字节数。我打赌这有点复杂

    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;
    }