2015-11-08 7 views
7

मैं URLConnection के साथ बाइट गिनती के निम्नतम स्तर को प्राप्त करने का प्रयास कर रहा हूं। मैं अपाचे कॉमन्स आईओ से CountingInputStream और CountingOutputStream के साथ दो धाराओं से गुज़रने वाले डेटा को गिनने के लिए पहले से ही गया हूं, लेकिन बाइट गिनती मुझे प्राप्त होने वाले शरीर के आकार के बराबर है + प्रतिक्रिया शरीर का आकार मैं वापस प्राप्त कर रहा हूं।URL कनेक्शन कम स्तर बाइट गिनती

एचटीपी क्लाइंट में, मेरे पास 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 पर कुछ बाइट आकार संकेत हेडर भेजा जाता है नहीं दिख रहा है? मैं केवल शरीर के आकार को कैसे देख सकता हूं? हेडर कहां हैं? यूआरएल कॉल? डीएनएस समाधान बाइट्स?

  2. क्या प्रत्येक बाइट को मापने का कोई तरीका है कि URLConnection लाइब्रेरी पर कॉल नेटवर्क इंटरफ़ेस पर भेजता है? सबसे कम स्तर, बेहतर!

उत्तर

2

URLConnection हेडर के पढ़ने (और लेखन) को सारणीबद्ध करने के लिए डिज़ाइन किया गया है। उस वर्ग के इनपुट और आउटपुट स्ट्रीम केवल शरीर का प्रतिनिधित्व करते हैं; हेडर में हेरफेर करने के लिए विशिष्ट दिनचर्या हैं ताकि उन्हें सीधे लिखे जाने की आवश्यकता न हो।

यदि आप सूर्य/ओरेकल जेआरई में हुड के नीचे देखते हैं, तो आप देखेंगे कि HttpURLConnection का उनका कार्यान्वयन HTTP क्लाइंट का अपना संस्करण उपयोग कर रहा है। वह ग्राहक पूरी सामग्री का पूर्ण पढ़ने और लेखन कर रहा है।

आप URLConnection का अपना कार्यान्वयन लिखने में सक्षम हो सकते हैं जो कि सूर्य/ओरेकल (और अपाचे) क्या कर रहा है, इसकी नकल करता है, लेकिन साथ ही बाइट पढ़ने/लिखे गए बाइट्स की संख्या ट्रैक करता है। मैं डरता हूं कि यह थोड़ा जटिल है।

संबंधित मुद्दे