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

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

int getInternetConnectionSpeed() { ... } 

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

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

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

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

 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()返回所有下载线程的吞吐量,并且您可以在应用程序执行期间动态打开和关闭线程。

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

如果下载10MB需要60秒,则可以使用(10 * 1024 * 8/60)Kbps或1365 Kbps连接。

但是有很多速度取决于你想要连接的位置:

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

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

哦,请注意,你甚至可能长途冲浪!