如何使用Apache FTPClient测量上传/下载速度



我正在使用Apache FTPClient在Android设备和某些FTP服务器之间下载/上传文件。我想测量以Mbps/kbps的下载和上传速度。

用于上传,我的代码看起来像这样:

// myFile is a path for local file inside my android device.
InputStream inputStream = new FileInputStream(myFile);
OutputStream outputStream = ftpclient.storeFileStream(remoteFile);
byte[] bytesIn = new byte[4096];
int read = 0;
while((read = inputStream.read(bytesIn)) != -1) {
    outputStream.write(bytesIn, 0, read);
}
inputStream.close();
outputStream.close();

对我来说重要的是要知道两件事:

  1. 供下载,我所做的是总结我在while循环内读取的字节(使用inputstream.read.read(serverfile)返回值)可以吗?它会反映下载速度吗?
  2. 为了上传,如何正确测量文件的上传速度?该FTP客户端如何完成?对于我所知道的,outputStream.write()不返回有用的值。我的想法是在每次迭代(写)之后检查FTP服务器中文件的更新大小是多少,但我不知道这是正确/最简单的方法。而且,如何使用此FTP客户端实施它。

我有一个简单的解决方案,但不是100%准确,您可以通过添加更多的采样率来改进它。现在,我只使用一个示例( totalfilesize - currentByTetransferred /( currenttime - stag_s> starttime )。您可以添加更多抽样以改善结果。以下是代码示例:

在此处更新上传统计

private final UploadStats uploadStats = new UploadStats();
private void updateUploadStats(long totalBytesTransferred, int bytesTransferred, long streamSize) {
    long current = System.currentTimeMillis();
    synchronized (this.uploadStats) {
        long timeTaken = (current - uploadStats.getStartTime());
        if (timeTaken > 1000L) {
            uploadStats.setLastUpdated(current);
            uploadStats.setEstimatedSpeed(totalBytesTransferred / (timeTaken/1000L));
        }
        uploadStats.setTotalBytesTransferred(totalBytesTransferred);
        uploadStats.setBytesTransferred(bytesTransferred);
        uploadStats.setStreamSize(streamSize);
    }
}

创建CopyStreamListener并将其附加到ftpclient

        CopyStreamAdapter copyStreamAdapter = new CopyStreamAdapter() {
            @Override
            public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
                updateUploadStats(totalBytesTransferred, bytesTransferred, streamSize);
            }
        };
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect(url);
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
            ftpClient.disconnect();
            throw new Exception("Unable to connect.");
        }
        if (!ftpClient.login(username, password)) {
            ftpClient.disconnect();
            throw new Exception("Failed to login.");
        }
        ftpClient.setCopyStreamListener(copyStreamListener);
        ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
        ftpClient.enterLocalPassiveMode();
        ftpClient.storeFile(targetPath, inputFile);
        ftpClient.logout();
        ftpClient.disconnect();

上传stats bean无getter/setter。有些是无关的,可以跳过

public class UploadStats {
private long totalBytesTransferred;
private int bytesTransferred;
private long streamSize;
private long lastUpdated;
private double estimatedSpeed;
private long startTime;
private long totalSize; }

这只是伪代码。如果您打算阅读和显示进度,则可以通过线程改进,因此 syncronized 关键字。

最新更新