Java 计算网络下载速度

Java 计算网络下载速度,java,networking,download,Java,Networking,Download,我已经编写了以下代码来使用java计算下载速度。 但是它没有给出正确的结果。问题是什么?是我的逻辑有问题,还是java网络类的使用有问题?我认为是java网络类的使用有问题。有人能告诉我到底是什么问题吗 /*Author:Jinu Joseph Daniel*/ import java.io.*; import java.net.*; class bwCalc { static class CalculateBw { public void calculateUp

我已经编写了以下代码来使用java计算下载速度。 但是它没有给出正确的结果。问题是什么?是我的逻辑有问题,还是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()));
}
}
/*作者:基努·约瑟夫·丹尼尔*/
导入java.io.*;
导入java.net。*;
bwCalc类{
静态类计算器{
public void calculateUploadBw(){}
公共浮点CalculatedDownloadRate(int waitTime)引发异常{
int bufferSize=1;
字节[]数据=新字节[bufferSize];//缓冲区
BufferedInputStream in=新的BufferedInputStream(新URL(“https://www.google.co.in/openStream());
整数计数=0;
long startedAt=System.currentTimeMillis();
长时间停止;
浮动汇率;
而(((stoppedAt=System.currentTimeMillis())-startedAt)
您的代码有很多问题

  • 您没有检查正在读取的字节数
  • 用谷歌主页测试是没有用的,因为内容非常小,大部分下载时间与网络延迟有关;您应该尝试下载一个大文件(10+MB),除非您确实想要测量延迟而不是带宽,在这种情况下,您可以简单地运行ping
  • 如果你想得到任何相关的结果,你还需要给它500毫秒以上的时间——我想至少5秒
  • 有很多代码风格的问题,但这些不太重要

    • 您的代码有很多问题

      • 您没有检查正在读取的字节数
      • 用谷歌主页测试是没有用的,因为内容非常小,大部分下载时间与网络延迟有关;您应该尝试下载一个大文件(10+MB),除非您确实想要测量延迟而不是带宽,在这种情况下,您可以简单地运行ping
      • 如果你想得到任何相关的结果,你还需要给它500毫秒以上的时间——我想至少5秒
      • 有很多代码风格的问题,但这些不太重要

      以下是计算平均下载速率的代码,以KBs和MBs/秒为单位。您可以将它们按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 ");
          }
      

      下面的代码将计算您的平均下载速率(以KBs和MBs/秒为单位),您可以将它们缩放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 ");
          }
      

      请在这里发布您的代码,而不是通过链接。那么它会产生什么结果?当我增加时间时,结果会增加。请在这里发布您的代码,不是通过链接。那么它会产生什么结果呢?当我增加时间时,结果会增加读取的字节数与计数相同。这就是为什么我在一次读取完成时增加它的原因。荣-计数是读取数。只有一次读取一个字节时,它才是相同的。因此read()不会等到读取指定数量的字节。我的意思是,如果指定数量的字节不可用,它将只读取可用数据。因此,我应该每次检查缓冲区中的数据大小?。。。我该怎么做呢?read方法返回它读取的字节数(如果它读取任何内容)。参考javadoc。读取的字节数与计数相同。这就是为什么我在一次读取完成时增加它的原因。drong-count是读取数。只有一次读取一个字节时,它才是相同的。因此read()不会等到读取指定数量的字节。我的意思是,如果指定数量的字节不可用,它将只读取可用数据。因此,我应该每次检查缓冲区中的数据大小?。。。我该怎么做呢?read方法返回它读取的字节数(如果它读取任何内容)。请参阅javadoc。