Giter Site home page Giter Site logo

speed-test-lib's Introduction

Speed Test library

Build Status Download Coverage Status License Javadoc

Speed Test library for Java / Android :

  • speed test download with transfer rate output
  • speed test upload with transfer rate output
  • download and upload progress monitoring
  • speed test server / port / uri can be configured easily

  • For download process, library will download file from given speed test server parameters and calculate transfer rate
  • For upload process, library will generate a random file with a given size and will upload this file to a server calculating transfer rate

No external file are required and no file are stored in Hard Disk.

Include in your project

  • with Gradle, from jcenter :
compile 'com.github.akinaru:speedtest:1.09'

How to use ?

Instanciate SpeedTest class

SpeedTestSocket speedTestSocket = new SpeedTestSocket();

Add a listener to monitor

  • download process result with onDownloadPacketsReceived callback
  • upload process result with onUploadPacketsReceived callback
  • download progress with onDownloadProgress callback
  • upload progress with onUploadProgress callback
  • download error catch with onDownloadError
  • upload error catch with onUploadError
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

	@Override
	public void onDownloadPacketsReceived(int packetSize, float transferRateBitPerSeconds, float transferRateOctetPerSeconds) {
		System.out.println("download transfer rate  : " + transferRateBitPerSeconds + " bps");
		System.out.println("download transfer rate  : " + transferRateOctetPerSeconds + "Bps");
	}

	@Override
	public void onDownloadError(SpeedTestError errorCode, String message) {
		System.out.println("Download error " + errorCode + " occured with message : " + message);
	}

	@Override
	public void onUploadPacketsReceived(int packetSize, float transferRateBitPerSeconds, float transferRateOctetPerSeconds) {
		System.out.println("download transfer rate  : " + transferRateBitPerSeconds + " bps");
		System.out.println("download transfer rate  : " + transferRateOctetPerSeconds + "Bps");
	}

	@Override
	public void onUploadError(SpeedTestError errorCode, String message) {
		System.out.println("Upload error " + errorCode + " occured with message : " + message);
	}

	@Override
	public void onDownloadProgress(float percent, SpeedTestReport downloadReport) {
	}

	@Override
	public void onUploadProgress(float percent, SpeedTestReport uploadReport) {
	}

});

Start Download speed test

Download a single file from a server :

void startDownload(String hostname, int port, String uri)

params type description
hostname String server hostname
port int server port
uri String uri to fetch your file from server
speedTestSocket.startDownload("ipv4.intuxication.testdebit.info", 80,"/fichiers/10Mo.dat");

You can wait for test completion with closeSocketJoinRead() which is prefered to closeSocket() since it join reading thread before resuming application.

speedTestSocket.closeSocketJoinRead();

Start Upload speed test

Upload a single file with specified size to a server :

void startUpload(String hostname, int port, String uri, int fileSizeOctet)
params type description
hostname String server hostname
port int server port
uri String uri to fetch your file from server
fileSizeOctet int the file size to be uploaded to server (file will be generated randomly and sent to speed test server)

Here is an example for a file of 10Moctet :

speedTestSocket.startUpload("1.testdebit.info", 80, "/", 10000000);

Download/Upload during a fix amount of time

If you want to download/upload during a fix value, you can begin download/upload and then invoke :

speedTestSocket.forceStopTask();

The following will start downloading a file of 100Mo but will stop downloading 15 seconds later :

final Timer timer = new Timer();

/* instanciate speed test */
final SpeedTestSocket speedTestSocket = new SpeedTestSocket();

/* add a listener to wait for speed test completion and progress */
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

    @Override
    public void onDownloadPacketsReceived(long packetSize, float transferRateBitPerSeconds, float transferRateOctetPerSeconds) {
    }

    @Override
    public void onDownloadError(SpeedTestError speedTestError, String errorMessage) {
        if (speedTestError != SpeedTestError.FORCE_CLOSE_SOCKET) {
            if (timer != null) {
                timer.purge();
                timer.cancel();
            }
        }
    }

    @Override
    public void onUploadPacketsReceived(long packetSize, float transferRateBitPerSeconds, float transferRateOctetPerSeconds) {
    }

    @Override
    public void onUploadError(SpeedTestError speedTestError, String errorMessage) {
        if (speedTestError != SpeedTestError.FORCE_CLOSE_SOCKET) {
            if (timer != null) {
                timer.purge();
                timer.cancel();
            }
        }
    }

    @Override
    public void onDownloadProgress(float percent, SpeedTestReport downloadReport) {
    }

    @Override
    public void onUploadProgress(float percent, SpeedTestReport uploadReport) {
    }
});

TimerTask stopTask = new TimerTask() {
    @Override
    public void run() {
        System.out.println("--------------- FINISH REPORT -----------------------------");
        SpeedTestReport downloadReport = speedTestSocket.getLiveDownloadReport();
        System.out.println("---------------current download report--------------------");
        System.out.println("progress             : " + downloadReport.getProgressPercent() + "%");
        System.out.println("transfer rate bit    : " + downloadReport.getTransferRateBit() + "b/s");
        System.out.println("transfer rate octet  : " + downloadReport.getTransferRateOctet() + "B/s");
        System.out.println("downloaded for now   : " + downloadReport.getTemporaryPacketSize() + "/" + downloadReport.getTotalPacketSize());
        if (downloadReport.getStartTime() > 0) {
            System.out.println("amount of time       : " + ((downloadReport.getReportTime() - downloadReport.getStartTime()) / 1000) + "s");
        }
        speedTestSocket.forceStopTask();
        if (timer != null) {
            timer.cancel();
            timer.purge();
        }
    }
};
timer.schedule(stopTask, 15000);
speedTestSocket.startDownload("1.testdebit.info", 80, "/fichiers/100Mo.dat");

Default report interval

By default, progress report is achieved as following :

  • for upload, a progress report is sent and trigger onUploadProgress each time uploadChunkSize number of packet is sent. The default value for uploadChunkSize is 65535 but you can change with speedTestSocket.setUploadChunkSize(int chunkSize)

  • for download, a progress report is sent and trigger onDownloadProgress each time a chunk of data is read from the downlink socket

Set your own report interval

If you want to set a custom report interval, you can use a task scheduled at fixed rate to retrieve report with speedTestSocket.getLiveDownloadReport() or speedTestSocket.getLiveUploadReport() depending if you want download or upload report.

The following will start uploading a file of 10Mo and request reports every 400ms :

final Timer timer = new Timer();

/* instanciate speed test */
final SpeedTestSocket speedTestSocket = new SpeedTestSocket();

/* add a listener to wait for speed test completion and progress */
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

    @Override
    public void onDownloadPacketsReceived(long packetSize, float transferRateBitPerSeconds, float transferRateOctetPerSeconds) {
    }

    @Override
    public void onDownloadError(SpeedTestError speedTestError, String errorMessage) {
        if (speedTestError != SpeedTestError.FORCE_CLOSE_SOCKET) {
            if (timer != null) {
                timer.purge();
                timer.cancel();
            }
        }
    }

    @Override
    public void onUploadPacketsReceived(long packetSize, float transferRateBitPerSeconds, float transferRateOctetPerSeconds) {
    }

    @Override
    public void onUploadError(SpeedTestError speedTestError, String errorMessage) {
        if (speedTestError != SpeedTestError.FORCE_CLOSE_SOCKET) {
            if (timer != null) {
                timer.purge();
                timer.cancel();
            }
        }
    }

    @Override
    public void onDownloadProgress(float percent, SpeedTestReport downloadReport) {
    }

    @Override
    public void onUploadProgress(float percent, SpeedTestReport uploadReport) {
    }
});

TimerTask task = new TimerTask() {

    @Override
    public void run() {

        if (speedTestSocket.getSpeedTestMode() == SpeedTestMode.UPLOAD) {

            SpeedTestReport uploadReport = speedTestSocket.getLiveUploadReport();
            System.out.println("---------------current upload report--------------------");
            System.out.println("progress             : " + uploadReport.getProgressPercent() + "%");
            System.out.println("transfer rate bit    : " + uploadReport.getTransferRateBit() + "b/s");
            System.out.println("transfer rate octet  : " + uploadReport.getTransferRateOctet() + "B/s");
            System.out.println("uploaded for now     : " + uploadReport.getTemporaryPacketSize() 
                                    + "/" + uploadReport.getTotalPacketSize());
            System.out.println("amount of time       : " + 
                                ((uploadReport.getReportTime() - uploadReport.getStartTime()) / 1000) + "s");
            System.out.println("--------------------------------------------------------");

        } else if (speedTestSocket.getSpeedTestMode() == SpeedTestMode.DOWNLOAD) {

            SpeedTestReport downloadReport = speedTestSocket.getLiveDownloadReport();
            System.out.println("---------------current download report--------------------");
            System.out.println("progress             : " + downloadReport.getProgressPercent() + "%");
            System.out.println("transfer rate bit    : " + downloadReport.getTransferRateBit() + "b/s");
            System.out.println("transfer rate octet  : " + downloadReport.getTransferRateOctet() + "B/s");
            System.out.println("downloaded for now   : " + downloadReport.getTemporaryPacketSize() 
                                    + "/" + downloadReport.getTotalPacketSize());
            System.out.println("amount of time       : "
                                    + ((downloadReport.getReportTime() - downloadReport.getStartTime()) / 1000) + "s");
        }
    }
};

// scheduling the task at interval
timer.scheduleAtFixedRate(task, 0, 400);

speedTestSocket.startUpload("1.testdebit.info", 80, "/", 10000000);

Get live download & upload

  • retrieve current download report :
SpeedTestReport getLiveDownloadReport()
  • retrieve current upload report :
SpeedTestReport getLiveUploadReport()

Set size of each packet sent to upload server

speedTestSocket.setUploadChunkSize(65535);

Set socket timeout value

You can set download socket timeout in milliseconds :

speedTestSocket.setSocketTimeout(5000);

Android Integration

  • add Internet permission to manifest :
<uses-permission android:name="android.permission.INTERNET" />
  • use an AsyncTask to run your speed test :
public class SpeedTestTask extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {

        SpeedTestSocket speedTestSocket = new SpeedTestSocket();
        speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {

            @Override
            public void onDownloadPacketsReceived(int packetSize, 
            									float transferRateBitPerSeconds, 
            									float transferRateOctetPerSeconds) {
                Log.i("speed-test-app","download transfer rate  : " + transferRateOctetPerSeconds + "Bps");
            }

            @Override
            public void onDownloadError(SpeedTestError errorCode, String message) {
                Log.i("speed-test-app","Download error " + errorCode + " occured with message : " + message);
            }

            @Override
            public void onUploadPacketsReceived(int packetSize, 
            									float transferRateBitPerSeconds, 
            									float transferRateOctetPerSeconds) {
                Log.i("speed-test-app","download transfer rate  : " + transferRateOctetPerSeconds + "Bps");
            }

            @Override
            public void onUploadError(SpeedTestError errorCode, String message) {
                Log.i("speed-test-app","Upload error " + errorCode + " occured with message : " + message);
            }

            @Override
            public void onDownloadProgress(float percent,SpeedTestReport downloadReport) {
            }

            @Override
            public void onUploadProgress(float percent,SpeedTestReport uploadReport) {
            }

        });

        speedTestSocket.startUpload("1.testdebit.info", 
        							80, "/", 10000000); //will block until upload is finished

        return null;
    }
}

Execute it with : new SpeedTestTask().execute();

JavaDoc

http://akinaru.github.io/speed-test-lib

Quick test

./gradlew quickTest

Compatibility

JRE 1.7 compliant

Build

Gradle using IntelliJ IDEA or Eclipse

External libraries

SpeedTest Server tested

License

The MIT License (MIT) Copyright (c) 2016 Bertrand Martel

speed-test-lib's People

Contributors

bertrandmartel avatar

Stargazers

SoyLatte avatar

Watchers

SoyLatte avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.