2015-11-08 18 views
7

我試圖獲得最低級別的字節計數可能與URLConnection。我已經去計算兩條數據流的傳遞數據,其中來自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; 
} 

使用這些方法我獲得更接近值隨HttpClient的比的URLConnection。

兩個問題:

  1. 爲什麼上URLConnection的,我不上的OutputStream看到一些字節大小指示的頭被髮送?我怎麼只看到身體的大小?標題在哪裏?該網址的電話? DNS解析字節?

  2. 有沒有辦法測量對URLConnection庫的調用在網絡接口上發送的每個字節?最低級別越好越好!

回答

2

URLConnection旨在抽象出標題的閱讀(和寫作)。該類的輸入和輸出流只表示主體;有特定的操作標題的例程,以便不必直接寫入。

如果你在Sun/Oracle JRE的底層,你會發現他們的HttpURLConnection實現使用他們自己的HTTP客戶端版本。該客戶正在對整個內容進行完整的閱讀和寫作。

您可能可以編寫自己的URLConnection實現來模擬Sun/Oracle(和Apache)正在做什麼,但同時會跟蹤讀取/寫入的字節數。然而,我認爲這有點複雜。