0

有两个目录(本地和远程)。目录是同步的。我不想让网络变慢。我想对速度使用动态限制。所以,我应该确定网络速度(用于上传)。

如何确定网络速度(用于上传)?任何想法?

4

2 回答 2

1

如果要每秒发送 X MB,请发送 X MB,如果不到一秒,请等到一秒结束。要确定您发送的数量,请在发送数据时保留一个计数器。

于 2013-04-28T17:44:08.840 回答
0

我的问题解决了。我想暂时确定网络速度,并且我想对每个上传文件(或下载文件)的速度使用动态限制(例如:%50 以下)。例如; 如果我的上传速度是每秒 100kb,那么动态应该是每秒 50kb,如果是每秒 150kb,那么动态应该是每秒 75kb。

因此,我上传了我的第一个文件包并确定bytes per second. 这是我的上传速度。然后,我确定我的动态限制(限制 = myUploadSpeed %50)。然后,计算睡眠持续时间(sleep_duration=((myUploadSpeed-limit)/limit)*1000)(从毫秒转换为秒有 1000 个)。if (limit>bytesPerSecond)对于发送到下一个的每个数据包,等待直到sleep_duration

我的节流代码如下:

private void throttle() throws IOException {
      long limit= calculateMaxBytesPerSecond();
      long bytePerSec= getBytesPerSec();
    if (limit!=-1 && bytePerSec > limit) {

        long sleep_duration=((bytePerSec-limit)/limit)*1000;

      try {
          if(sleep_duration==0)
              Thread.sleep(1000);
          else
              Thread.sleep(sleep_duration);

        totalSleepTime += SLEEP_DURATION_MS;
      } catch (InterruptedException e) {
        throw new IOException("Thread aborted", e);
      }
    }
  }

private long calculateMaxBytesPerSecond() {
      switch (streamType) {
    case 0:
        if(connectionManager.getDownloadSpeedLimit()>0)
            return connectionManager.getDownloadSpeedLimit() / downloadManager.getTaskCount();
        else
            return -1;

    case 1:
        if(connectionManager.getUploadSpeedLimit()>0)
            return connectionManager.getUploadSpeedLimit() / uploadManager.getTaskCount();
        else
            return -1;
    }

    return Long.MAX_VALUE;
  }

public long getBytesPerSec() {
    long elapsed = (System.currentTimeMillis() - startTime) / 1000;
    if (elapsed == 0) {
      return bytesRead;
    } else {
      return bytesRead / elapsed;
    }
  }
于 2013-05-09T11:30:45.447 回答