2015-11-08 5 views
7

URLConnectionで可能な最も低いレベルのバイトカウントを取得しようとしています。私はすでに2つのストリームを通過するデータをカウントするようになりましたが、Apache Commons IOからはCountingInputStreamCountingOutputStreamとなりましたが、バイトカウントは私が送信するボディサイズと等しいです+レスポンスボディサイズは戻ってきます。URLConnectionローレベルバイトカウント

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

私はURLConnectionのよりHttpClientを持つはるかに近い値を取得し、これらのメソッドを使用します。

つの質問:

  1. のURLConnectionに来るどのように、私はOutputStreamの上のヘッダが送信されるいくつかのバイトサイズの表示を参照してくださいませんか?どのように体の大きさしか見えませんか?ヘッダーはどこですか? URLの呼び出し? DNS解決バイト?

  2. URLConnectionライブラリへの呼び出しがネットワークインターフェイス上で送信するすべてのバイトを測定する方法はありますか?最低レベル、より良い!

答えて

2

URLConnectionは、ヘッダーの読み込み(および書き込み)を抽象化するように設計されています。そのクラスの入出力ストリームはボディのみを表します。ヘッダーを操作するための特別なルーチンがあり、ヘッダーを直接書き込む必要はありません。

Sun/Oracle JREのフードを見ると、HttpURLConnectionの実装で独自のバージョンのHTTPクライアントが使用されていることがわかります。そのクライアントはコンテンツ全体を完全に読み書きしています。

URLConnectionの実装は、Sun/Oracle(およびApache)の動作を模倣しながら書くことができますが、同時に読み書きするバイト数を追跡​​できます。しかし、私は少し複雑ですが賭ける。

関連する問題