0

2 つのディレクトリ (ローカルとリモート) があります。ディレクトリが同期されます。ネットワークを遅くしたくありません。速度に動的制限を使用したい。そのため、ネットワーク速度 (アップロード用) を決定する必要があります。

ネットワーク速度を決定する方法 (アップロード用)? 何か案が?

4

2 に答える 2

1

1 秒あたり X MB を送信したい場合は、X MB を送信し、1 秒未満の場合は、1 秒の終わりまで待ちます。送信している量を判断するには、データを送信するたびにカウンターを保持します。

于 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 に答える