【问题标题】:How to measure upload/ download speed with Apache FTPClient如何使用 Apache FTPClient 测量上传/下载速度
【发布时间】:2015-07-28 08:35:54
【问题描述】:

我正在使用 Apache FTPClient 在安卓设备和一些 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(serverFile) 返回值) 可以吗?会反映下载速度吗?
  2. 对于上传,如何正确测量文件的上传速度?这个FTP客户端怎么做? 据我所知, outputStream.write() 没有返回有用的值.. 我的想法是在每次迭代(写入)后检查 FTP 服务器中文件的更新大小,但我不知道这是否是正确/最简单的方法。还有,如何用这个 FTP 客户端实现它。

【问题讨论】:

    标签: java android ftp


    【解决方案1】:

    我有一个简单的解决方案,但不是 100% 准确,您可以通过增加采样率来改进它。现在我只使用一个示例 (TotalFileSize-CurrentByteTransferred/(CurrentTime-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();
    

    在没有 getter/setter 的情况下上传 Stats bean。有些无关紧要,可以跳过

    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 关键字。

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      相关资源
      最近更新 更多