Java >> Java-zelfstudie >  >> Java

Downloadsnelheid meten met Java/Android

Er zijn hier een paar mogelijke problemen:

  1. Als u dit direct op een willekeurig apparaat wilt doen (vs. in een laboratoriumomgeving), moet u de aanbeveling van Jeffrey volgen, omdat andere apps bandbreedte kunnen verbruiken die zou worden gerapporteerd door getTotalRxBytes() .

  2. Hiermee wordt de downloadsnelheid van deze host getest. Als dat de host is waarmee je voor "echte dingen" communiceert, is dat cool. Of, als je in het algemeen een idee van de downloadsnelheid nodig hebt, is dat ook oké. Maar het testen van de downloadsnelheid van site A en aannemen dat deze nauwkeurig is voor site B, is onbetrouwbaar, omdat site A en site B zich misschien niet eens op hetzelfde continent bevinden.

  3. Als u verwacht dit veel te doen, kan de eigenaar van de host waar u tegen test, enigszins geïrriteerd raken door de bandbreedtekosten, overmatige logboekinvoer, enz. In het ideale geval zou u dit alleen doen tegen iets dat u bezit.

  4. Voor abonnementen met datadata kan 200 KB de eigenaar van het apparaat irriteren.

  5. Alle standaardvoorbehouden met betrekking tot internettoegang (bijv. server kan down zijn) en mobiele apparaten (bijv. gebruiker kan op wifi beginnen en buiten bereik raken, waardoor uw downloadmogelijkheden drastisch veranderen) van toepassing zijn.

Dat gezegd hebbende, het doen van een download is de enige echte manier om downloadsnelheden te meten.


Gebruik onderstaande code. Ik heb het gebruikt om de downloadsnelheid te meten. U hoeft het bestand niet op te slaan om de downloadsnelheid te meten. U hoeft OkHttp waarschijnlijk ook niet te gebruiken. Ik heb het gebruikt omdat het in ons project werd gebruikt.

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

Java-tag