2013-02-23 3 views
0

나는 자바를 사용하여 다운로드 속도를 계산하기 위해 다음 코드를 작성했다. 하지만 올바른 결과를 제공하지 않습니다. 문제점은 무엇입니까? 내 논리에 문제가 있습니까? 아니면 Java 네트워킹 클래스 사용에 문제가 있습니까? Java 네트워킹 클래스 사용에 문제가 있다고 생각합니다. 아무도 할 수 없습니다. 문제가 정확히 무엇인지 말해 주시겠습니까? 컨텐츠 크기이기 때문에 코드에 많은 문제가 있습니다네트워크 다운로드 속도 계산

/*Author:Jinu Joseph Daniel*/ 
import java.io.*; 
import java.net.*; 
class bwCalc { 
    static class CalculateBw { 
      public void calculateUploadBw() {} 
      public float calculateDownloadRate(int waitTime) throws Exception { 
       int bufferSize = 1; 
       byte[] data = new byte[bufferSize]; // buffer 
       BufferedInputStream in = new BufferedInputStream(new URL("https://www.google.co.in/").openStream()); 
       int count = 0; 
       long startedAt = System.currentTimeMillis(); 
       long stoppedAt; 
       float rate; 
       while (((stoppedAt = System.currentTimeMillis()) - startedAt) < waitTime) { 
        if (in .read(data, 0, bufferSize) != -1) { 
        count++; 
       } else { 
        System.out.println("Finished"); 
        break; 
       } 
      } 
      in .close(); 
      rate = 1000 * (((float) count*bufferSize*8/(stoppedAt - startedAt)))/(1024*1024);//rate in Mbps 
      return rate; 
     } 
    public float calculateAverageDownloadRate() throws Exception{ 
     int times[] = {100,200,300,400,500}; 
     float bw = 0,curBw; 
     int i = 0, len = times.length; 
     while (i < len) { 
      curBw = calculateDownloadRate(times[i++]); 
      bw += curBw; 
      System.out.println("Current rate : "+Float.toString(curBw)); 
     } 
     bw /= len; 
     return bw; 
    } 
} 
public static void main(String argc[]) throws Exception { 
    CalculateBw c = new CalculateBw(); 
    System.out.println(Float.toString(c.calculateAverageDownloadRate())); 
} 
} 
+2

링크를 통해서가 아니라 여기에 코드를 게시하십시오. –

+0

그래서 어떤 결과가 나옵니까? –

+0

내가 시간을 늘리면 결과가 증가합니다 –

답변

2

... 당신은 구글의 홈 페이지

  • 테스트를 읽고 얼마나 많은 바이트 당신이 확인하지 않는

    • 는 쓸모가 매우 작고 다운로드 시간은 네트워크 대기 시간과 관련이 있습니다. 당신은 큰 파일 (10 MB 이상)을 다운로드해야합니다 - UNLESS 대역폭 대신 대기 시간을 측정하고 싶다면 간단히 핑을 실행할 수 있습니다.
    • 원하는 경우 500ms 이상 제공해야합니다. 모든 관련 결과를 얻을 - 내가 코드 스타일의 문제를 최소 5 초
    • 많은 말하고 싶지만,하지만 사람들은 여기에
  • +0

    읽은 바이트 수는 count ..와 동일합니다. 왜냐하면 하나의 읽기가 끝날 때 증가하는 이유입니다. –

    +0

    잘못된 수는 읽기 수입니다. 한 번에 한 바이트 씩 읽는 경우에만 동일합니다. – aditsu

    +0

    그래서 read()는 지정된 바이트 수가 읽힐 때까지 기다리지 않습니다. 지정된 바이트 수가 사용 가능하지 않으면 사용 가능한 데이터 만 읽습니다. 그래서 버퍼의 데이터 크기를 확인해야합니다. 매번? 어떻게 할 수 있니? –

    0

    덜 중요한 것은와 KBS 매크로 블럭에서 당신의 평균 다운로드 속도를 계산합니다 코드입니다 초당 비트 수로 비율을 얻기 위해 8로 스케일 할 수 있습니다.

    public static void main(String argc[]) throws Exception { 
         long totalDownload = 0; // total bytes downloaded 
         final int BUFFER_SIZE = 1024; // size of the buffer 
         byte[] data = new byte[BUFFER_SIZE]; // buffer 
         BufferedInputStream in = new BufferedInputStream(
           new URL(
             "http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.15/linux-headers-2.6.15-020615_2.6.15-020615_all.deb") 
             .openStream()); 
         int dataRead = 0; // data read in each try 
         long startTime = System.nanoTime(); // starting time of download 
         while ((dataRead = in.read(data, 0, 1024)) > 0) { 
          totalDownload += dataRead; // adding data downloaded to total data 
         } 
         /* download rate in bytes per second */ 
         float bytesPerSec = totalDownload 
           /((System.nanoTime() - startTime)/1000000000); 
         System.out.println(bytesPerSec + " Bps"); 
         /* download rate in kilobytes per second */ 
         float kbPerSec = bytesPerSec/(1024); 
         System.out.println(kbPerSec + " KBps "); 
         /* download rate in megabytes per second */ 
         float mbPerSec = kbPerSec/(1024); 
         System.out.println(mbPerSec + " MBps "); 
        }