2015-11-08 18 views
7

Sto cercando di ottenere il livello più basso di conteggio dei byte possibile con URLConnection. Sono già andato a contare i dati che passavano per i due stream, con CountingInputStream e CountingOutputStream dall'IO di Apache Commons, ma il conteggio dei byte che ottengo è uguale alla dimensione del corpo che sto inviando + la dimensione del corpo della risposta che sto ricevendo.Conteggio byte basso livello URLConnection

In HttpClient, avevo uno MeasuringClientConnManager con quello che presumo essere un conteggio di byte di livello più basso.

per ottenere il valore più esatto, sto confrontando il conteggio su quelle biblioteche con questi metodi, usando 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; 
} 

utilizzare questi metodi ho ottenuto valori molto più stretto con HttpClient di URLConnection.

due domande:

  1. Come andiamo URLConnection, non vedo l'OutputStream qualche indicazione dimensione in byte le intestazioni vengono inviati? Come mai vedo solo la dimensione del corpo? Dove sono le intestazioni? L'url chiama? I byte di risoluzione DNS?

  2. C'è un modo per misurare ogni byte che una chiamata alla libreria URLConnection invia sull'interfaccia di rete? Il livello più basso, meglio è!

risposta

2

URLConnection è progettato per astrarre la lettura (e la scrittura) delle intestazioni. I flussi di input e output di quella classe rappresentano solo il corpo; ci sono routine specifiche per manipolare le intestazioni in modo che non debbano essere scritte direttamente.

Se si guarda sotto il cofano in Sun/Oracle JRE, vedrete che la loro implementazione di HttpURLConnection utilizza la propria versione di un client HTTP. Quel cliente sta facendo la lettura e la scrittura complete di tutto il contenuto.

Potrebbe essere possibile scrivere la propria implementazione di URLConnection che imita ciò che Sun/Oracle (e Apache) stanno facendo, ma allo stesso tempo traccia il numero di byte letti/scritti. Scommetto che è un po 'complicato comunque.

Problemi correlati