2013-04-28 105 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秒,請等到第二秒結束。要確定您發送的數據量,請在發送數據時保留一個計數器。