2013-04-28 101 views
0

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

如何确定网络速度(上传)? 有什么想法?

回答

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; 
    } 
    } 
1

如果您希望每秒发送X MB,请发送X MB,如果小于1秒,请等到第二秒结束。要确定您发送的数据量,请在发送数据时保留一个计数器。