有两个目录(本地和远程)。目录是同步的。我不想放慢网络速度。我想对速度使用动态限制。所以,我应该确定网络速度(上传)。
如何确定网络速度(上传)? 有什么想法吗?
答案 0 :(得分:1)
如果您想每秒发送X MB,请发送X MB,如果它不到一秒,请等到第二秒结束。要确定发送的数量,请在发送数据时保留计数器。
答案 1 :(得分:0)
我的问题解决了。我想暂时确定网络速度,我想对每个上传文件(或下载文件)使用速度的动态限制(例如:%50%)。例如;如果我的上传速度为每秒100kb,它应该是每秒50kb动态,如果它是每秒150kb,那么它应该是每秒75kb动态。
所以,我上传了我的第一个文件包并确定bytes per second
。这是我的上传速度。然后,我确定我的动态限制(limit = 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;
}
}