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

Fra*_*ank 5 java connection performance

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

int getInternetConnectionSpeed()
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

Cat*_*hwa 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);
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这是给猫剥皮的一个聪明方法! (2认同)