如何用Java检测Internet连接速度?

时间:2010-11-08 20:37:34

标签: java connection performance

在我的Java应用程序中,如何检测Internet连接速度有多快?例如,我在家里使用AT& T Fast DSL,我想知道是否有办法可以编写一个方法来执行以下操作:

int getInternetConnectionSpeed()
{
   ...
}

将以kbps为单位返回一个数字,例如2800kbps [2.8 M]

编辑: 我问的原因是,在我的应用程序中,我可以打开多个Internet流,具体取决于用户的Internet连接速度,我希望它自动确定打开多少流而不会阻塞应用程序。

3 个答案:

答案 0 :(得分:2)

下载已知(且足够大)的文件所需的时间。

如果需要60秒才能下载10MB,那么您将拥有(10 * 1024 * 8/60)Kbps或1365 Kbps连接。

答案 1 :(得分:2)

我认为你可能会以错误的方式思考问题。拍摄连接速度的快照仅表示它们在该时刻的吞吐量。当您运行测试时,他们可以非常轻松地运行另一个应用程序,这会吸收他们的带宽,然后您的测量值就毫无价值。

相反,我认为您应该不断添加或删除线程,具体取决于它是增加还是减少吞吐量。我建议这样的事情(仅限伪代码):

while(true) {
  double speedBeforeAdding = getCurrentSpeed();
  addThread();
  // Wait for speed to stabilise
  sleep(20 seconds);
  double speedAfterAdding = getCurrentSpeed();
  if(speedAfterAdding < speedBeforeAdding) {
    // Undo the addition of the new thread
    removeThread();
    // Wait for speed to stabilise
    sleep(20 seconds);

    if(getNumberOfThreads() > 1) {
      double speedBeforeRemoving = getCurrentSpeed();
      // Remove a thread because maybe there's too many
      removeThread();
      // Wait for speed to stabilise
      sleep(20 seconds);
      double speedAfterRemoving = getCurrentSpeed();
      if(speedAfterRemoving < speedBeforeRemoving) {
        // Add the thread back
        addThread();
        // Wait for speed to stabilise
        sleep(20 seconds);
      }
    }
  }
}

你可以摆弄睡眠时间以适应。我假设getCurrentSpeed()返回所有下载线程的吞吐量,并且您能够在应用程序执行期间动态打开和关闭线程。

答案 2 :(得分:1)

但是根据您想要连接的位置,有很多速度:

  • 127.0.0.1?
  • 您的本地子网?
  • 您的互联网?

由于您的JVM使用使用本地网络的本地PC,因此无法自动获得DSL速度。

哦,请注意,你甚至可能正在冲浪long distance