2012-09-03 7 views
7

के साथ डाउनलोड स्पीड मापना मैं एक एंड्रॉइड ऐप पर काम कर रहा हूं जहां मुझे यथासंभव सटीक रूप से, मौजूदा कनेक्शन की डाउनलोड गति को मापने की आवश्यकता है। यहाँ सबसे अच्छा तरीका मैं अब तक मिल सकता है है (मूल रूप से मैं एक टाइमर शुरू, एक तेजी से सर्वर से एक Linux distro डाउनलोड करने, लगभग 200 Kbytes डाउनलोड, तो घड़ी बंद करो और समय बीत जाँच और कुल बाइट्स डाउनलोड किया शुरू):जावा/एंड्रॉइड

try{     
    InputStream is = new URL("http://www.domain.com/ubuntu-linux.iso").openStream(); 
    byte[] buf = new byte[1024]; 
    int n = 0;    
    startBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/ 
    startTime = System.nanoTime(); 
    while(n<200){ 
     is.read(buf); 
     n++;     
    } 
    endTime = System.nanoTime(); 
    endBytes = TrafficStats.getTotalRxBytes(); /*gets total bytes received so far*/ 
    totalTime = endTime - startTime; 
    totalBytes = endBytes - startBytes; 
} 
catch(Exception e){ 
    e.printStackTrace(); 
} 

उसके बाद मुझे बस उठाए गए बाइट्स की संख्या को विभाजित करने की आवश्यकता है और यह डाउनलोड गति को बीपीएस में देगी।

प्रश्न: 1. क्या यह विधि सटीक होगी? 2. क्या आप बेहतर जानते हैं?

बहुत बहुत धन्यवाद।

+0

वे जिस तरह से आपने इसे अभी स्थापित किया है, यह सटीक नहीं होगा। 'इनपुटस्ट्रीम.read' पूरी तरह से आपके बफर को भरने की गारंटी नहीं है। आपको यह देखने के लिए रिटर्न वैल्यू की जांच करनी होगी कि कितने 'बाइट' वास्तव में पढ़े गए थे। – Jeffrey

+1

@ जेफरी, आपने कोड को विस्तार से नहीं पढ़ा। मैं बाइट्स की संख्या प्राप्त करने के लिए पढ़ने() पर भरोसा नहीं कर रहा हूं। मैं इसे getTotalRxBytes() फ़ंक्शन के माध्यम से ओएस से सीधे प्राप्त कर रहा हूं। –

+0

आह, मेरा बुरा। मैं वास्तव में उस हिस्से पर स्कीम किया था। आपके पास समाधान कम या ज्यादा सटीक होगा। – Jeffrey

उत्तर

4

वहाँ कुछ संभावित समस्याओं यहां हैं:

  1. आप एक मनमाना डिवाइस पर मक्खी पर यह करने के लिए देख रहे हैं (बनाम एक प्रयोगशाला की स्थापना में), तो आपको जेफरी की सिफारिश का पालन करना होगा, क्योंकि अन्य ऐप्स बैंडविड्थ का उपभोग कर सकते हैं जिसे getTotalRxBytes() द्वारा रिपोर्ट किया जाएगा।

  2. यह परीक्षण इस होस्ट से गति डाउनलोड करता है। यदि वह मेजबान है तो आप "वास्तविक सामान" के साथ संवाद करेंगे, यह अच्छा है। या, अगर आपको सामान्य रूप से डाउनलोड की गति के विचार की आवश्यकता है, तो यह ठीक है। लेकिन साइट ए से डाउनलोड की गति का परीक्षण करना और यह मानना ​​कि साइट बी के लिए यह सटीक होगा, क्योंकि साइट ए और साइट बी एक ही महाद्वीप पर भी नहीं हो सकता है।

  3. यदि आप ऐसा करने की उम्मीद करते हैं, तो आप जिस मेजबान के खिलाफ परीक्षण कर रहे हैं उसका मालिक बैंडविड्थ व्यय, अत्यधिक लॉग प्रविष्टियों आदि पर हल्के से परेशान हो सकता है। आदर्श रूप में, आप केवल अपने ही कुछ के खिलाफ ऐसा करेंगे।

  4. मीट्रिक डेटा प्लान के लिए, 200 केबी डिवाइस के मालिक को परेशान कर सकता है।

  5. इंटरनेट एक्सेस (उदा।, सर्वर डाउन हो सकता है) और मोबाइल डिवाइस (उदाहरण के लिए, उपयोगकर्ता वाईफाई पर शुरू हो सकता है और सीमा से बाहर निकल सकता है, आपकी डाउनलोड क्षमता को काफी बदल सकता है) लागू होता है।

यह सब कहा जा रहा है कि डाउनलोड करने का एकमात्र असली तरीका डाउनलोड गति को मापने का एकमात्र असली तरीका है।

+0

पहले बिंदु के संबंध में: "अन्य ऐप्स बैंडविड्थ का उपभोग कर सकते हैं जो GetTotalRxBytes() द्वारा रिपोर्ट किया जाएगा" यदि विचार बैंड चौड़ाई को मापना है तो getTotalRxBytes() का उपयोग करना ठीक है, क्योंकि अन्य ऐप्स बैंडविड्थ का उपभोग करते हैं अपनी गणना पर विचार करें। – Chiara

1

नीचे दिए गए कोड का प्रयोग करें। मैंने डाउनलोड गति को मापने के लिए इसका इस्तेमाल किया। आपको डाउनलोड गति को मापने के उद्देश्य से फ़ाइल को सहेजने की आवश्यकता नहीं है। आपको शायद OkHttp का उपयोग करने की आवश्यकता नहीं है। मैंने इसका इस्तेमाल किया क्योंकि यह हमारी परियोजना में इस्तेमाल किया गया था।

String downloadURL = "http://test.talia.net/dl/1mb.pak"; 

    MediaType FILE = MediaType.parse("multipart/form-data;"); 

    OkHttpClient downloadClient = new OkHttpClient().newBuilder() 
      .build(); 

    Request download = new Request.Builder() 
      .url(downloadURL) 
      .build(); 

    downloadClient.newCall(download).enqueue(new Callback() { 
     @Override 
     public void onFailure(Call call, IOException e) { 

     } 

     @Override 
     public void onResponse(Call call, Response response) throws IOException { 
      if(response!=null) { 
       long startTime = System.currentTimeMillis(); 
       InputStream is = response.body().byteStream(); 
       BufferedInputStream bis = new BufferedInputStream(is); 
       long size = 0; 
       int red = 0; 
       byte[] buf = new byte[1024]; 
       while ((red = bis.read(buf)) != -1) { 
        size += red; 
       } 
       long endTime = System.currentTimeMillis(); 
       double rate = (((size/1024)/((endTime - startTime)/1000)) * 8); 
       rate = Math.round(rate * 100.0)/100.0; 
       String ratevalue; 
       if(rate > 1000) 
        ratevalue = String.valueOf(rate/1024).concat(" Mbps"); 
       else 
        ratevalue = String.valueOf(rate).concat(" Kbps"); 
       if(is!=null) { 
        is.close(); 
       } 
       if(bis!=null) { 
        bis.close(); 
       } 
       Log.d("download", "download speed = " + ratevalue); 
      } 
     } 
    });