Speed Test client library for Java/Android with HTTP & FTP support
Check a non-exhaustive list of compatible speed test server.
compile 'fr.bmartel:jspeedtest:1.32.1'
SpeedTestSocket speedTestSocket = new SpeedTestSocket();
// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {
@Override
public void onCompletion(SpeedTestReport report) {
// called when download/upload is complete
System.out.println("[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
System.out.println("[COMPLETED] rate in bit/s : " + report.getTransferRateBit());
}
@Override
public void onError(SpeedTestError speedTestError, String errorMessage) {
// called when a download/upload error occur
}
@Override
public void onProgress(float percent, SpeedTestReport report) {
// called to notify download/upload progress
System.out.println("[PROGRESS] progress : " + percent + "%");
System.out.println("[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
System.out.println("[PROGRESS] rate in bit/s : " + report.getTransferRateBit());
}
});
http://ipv4.ikoula.testdebit.info
speedTestSocket.startDownload("http://ipv4.ikoula.testdebit.info/1M.iso");
speedtest.tele2.net
speedTestSocket.startDownload("ftp://speedtest.tele2.net/1MB.zip");
ftp.otenet.gr
with credentials (username/password), default is anonymous/no passwordspeedTestSocket.startDownload("ftp://speedtest:speedtest@ftp.otenet.gr/test1Mb.db");
http://ipv4.ikoula.testdebit.info
speedTestSocket.startUpload("http://ipv4.ikoula.testdebit.info/", 1000000);
speedtest.tele2.net
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startUpload("ftp://speedtest.tele2.net/upload/" + fileName, 1000000);
Download during a fixed duration. Download will be stopped when the max duration is reached.
http://ipv4.ikoula.testdebit.info
speedTestSocket.startFixedDownload("http://ipv4.ikoula.testdebit.info/100M.iso", 10000);
speedtest.tele2.net
speedTestSocket.startFixedDownload("ftp://speedtest.tele2.net/100MB.zip");
Upload during a fixed duration. Upload will be stopped when the max duration is reached
http://ipv4.ikoula.testdebit.info
speedTestSocket.startFixedUpload("http://ipv4.ikoula.testdebit.info/", 10000000, 10000);
speedtest.tele2.net
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startFixedUpload("ftp://speedtest.tele2.net/upload/" + fileName, 10000000, 10000);
You can define your own report interval (interval between each onDownloadProgress
& onUploadProgress
) in milliseconds.
speedTestSocket.startDownload("http://ipv4.ikoula.testdebit.info/1M.iso", 1500);
speedTestSocket.startDownload("ftp://speedtest.tele2.net/1MB.zip", 1500);
speedTestSocket.startUpload("http://ipv4.ikoula.testdebit.info/", 10000000, 1500);
String fileName = SpeedTestUtils.generateFileName() + ".txt";
speedTestSocket.startUpload("ftp://speedtest.tele2.net/upload/" + fileName, 10000000, 1500);
speedTestSocket.setProxyServer("http://216.56.48.118:9000");
default proxy server port is 8080
You can chain multiple download/upload requests during a fixed duration. This way, there will be as much download/upload request until the end of the period
The following will download regularly for 20 seconds a file of 1Mo with download report each 2 seconds. Download reports will appear in onReport
callback of IRepeatListener
instead of onDownloadProgress
:
speedTestSocket.startDownloadRepeat("http://ipv4.ikoula.testdebit.info/1M.iso",
20000, 2000, new
IRepeatListener() {
@Override
public void onCompletion(final SpeedTestReport report) {
// called when repeat task is finished
}
@Override
public void onReport(final SpeedTestReport report) {
// called when a download report is dispatched
}
});
The following will upload regularly for 20 seconds a file of 1Mo with download report each 2 seconds. Upload reports will appear in onReport
callback of IRepeatListener
instead of onUploadProgress
:
speedTestSocket.startUploadRepeat("http://ipv4.ikoula.testdebit.info/", 1000000
20000, 2000, new
IRepeatListener() {
@Override
public void onCompletion(final SpeedTestReport report) {
// called when repeat task is finished
}
@Override
public void onReport(final SpeedTestReport report) {
// called when an upload report is dispatched
}
});
SpeedTestReport getLiveReport()
SpeedTestReport getLiveReport()
Setup time is the amount of time in milliseconds from which speed test will be calculated :
The following will set the setup time to 5 seconds which mean, the speed rate will begin to be computed 5 seconds after the speed test start :
speedTestSocket.setDownloadSetupTime(5000);
speedTestSocket.setUploadSetupTime(5000);
By default, data to be uploaded is stored in RAM, for large data it is recommended to used file storage :
speedTestSocket.setUploadStorageType(UploadStorageType.FILE_STORAGE);
It will create a temporary file containing random data. File will be deleted automatically at the end of the upload.
speedTestSocket.setUploadChunkSize(65535);
You can set download/upload socket timeout in milliseconds :
speedTestSocket.setSocketTimeout(5000);
These settings are used to alter transfer rate float rounding / scale :
speedTestSocket.setDefaultRoundingMode(RoundingMode.HALF_EVEN);
Default RoundingMode
used for transfer rate calculation is HALF_EVEN
. It can be override with :
speedTestSocket.setDefaultScale(4);
Default scale used for transfer rate calculation is 4
Set passive/active mode with :
speedTestSocket.setFtpMode(FtpMode.ACTIVE);
default is FtpMode.PASSIVE
<uses-permission android:name="android.permission.INTERNET" />
AsyncTask
to run your speed test :public class SpeedTestTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
SpeedTestSocket speedTestSocket = new SpeedTestSocket();
// add a listener to wait for speedtest completion and progress
speedTestSocket.addSpeedTestListener(new ISpeedTestListener() {
@Override
public void onCompletion(SpeedTestReport report) {
// called when download/upload is finished
Log.v("speedtest", "[COMPLETED] rate in octet/s : " + report.getTransferRateOctet());
Log.v("speedtest", "[COMPLETED] rate in bit/s : " + report.getTransferRateBit());
}
@Override
public void onError(SpeedTestError speedTestError, String errorMessage) {
// called when a download/upload error occur
}
@Override
public void onProgress(float percent, SpeedTestReport report) {
// called to notify download/upload progress
Log.v("speedtest", "[PROGRESS] progress : " + percent + "%");
Log.v("speedtest", "[PROGRESS] rate in octet/s : " + report.getTransferRateOctet());
Log.v("speedtest", "[PROGRESS] rate in bit/s : " + report.getTransferRateBit());
}
});
speedTestSocket.startDownload("http://ipv4.ikoula.testdebit.info/1M.iso");
return null;
}
}
Execute it with : new SpeedTestTask().execute();
All following examples use speed test server http://ipv4.ikoula.testdebit.info
for HTTP and speedtest.tele2.net
for FTP
./gradlew downloadFile
./gradlew uploadFile
./gradlew downloadFTP
./gradlew uploadFTP
./gradlew downloadFileProxy
./gradlew fixedDownload
./gradlew fixedUpload
./gradlew repeatDownload
./gradlew repeatUpload
./gradlew repeatChain
It's important to choose an adequate speed test server depending on latency/jitter. This library is not responsible for the speed test server choice.
Note that this library :
This library does provide an average of transfer rate for all individual chunks read/written for download/upload.
The 2 following links describe the process of speedtest.net :
JRE 1.7 compliant
./gradlew clean build -x test
./gradlew clean build
./gradlew test --tests "fr.bmartel.speedtest.test.SpeedTestFunctionalTest"
The MIT License (MIT) Copyright (c) 2016-2018 Bertrand Martel