2013-04-28 6 views
0

두 개의 디렉토리 (로컬 및 원격)가 있습니다. 디렉토리가 동기화됩니다. 나는 네트워크 속도를 늦추고 싶지 않다. 속도에 동적 제한을 사용하고 싶습니다. 따라서 네트워크 속도 (업로드 용)를 결정해야합니다.Java를 사용하는 최적화 네트워크 속도

네트워크 속도 (업로드 용)를 결정하는 방법은 무엇입니까? 아이디어가 있으십니까?

답변

0

내 문제가 해결되었습니다. 나는 네트워크 속도를 일시적으로 결정하고 각 업로드 파일 (또는 다운로드 파일)에 대한 속도 (예 : % 50 미만)에 동적 한계를 사용하려고합니다. 예를 들어; 업로드 속도가 초당 100kb라면 동적으로 초당 50kb가되어야하며 초당 150kb라면 동적으로 초당 75kb가되어야합니다.

그래서 내 파일의 첫 번째 패키지를 업로드하고 bytes per second을 결정합니다. 내 업로드 속도입니다. 그런 다음 동적 제한 (limit = myUploadSpeed ​​% 50)을 결정합니다. 그런 다음 수면 지속 시간 (sleep_duration=((myUploadSpeed-limit)/limit)*1000)을 계산하십시오 (밀리 초에서 초로 변환하려면 1000이 필요합니다). 로 스로틀하는 sleep_duration

내 코드는 다음과 때까지 다음에 전송 된 각 패킷에 대해 if (limit>bytesPerSecond), 잠깐 :

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

초당 XMB를 보내려면 XMB를 보내고 1 초 미만인 경우 두 번째 끝까지 기다리십시오. 얼마를 보내고 있는지 확인하려면 데이터를 보낼 때마다 카운터를 보관하십시오.