【问题标题】:How to detect Internet connection speed with Java?如何使用 Java 检测 Internet 连接速度?
【发布时间】:2010-11-09 06:17:16
【问题描述】:

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

int getInternetConnectionSpeed()
{
   ...
}

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

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

【问题讨论】:

  • 我认为要让这真正发挥作用,您必须在测试的另一端有一台服务器,该服务器可以处理高于 AT&T 连接最大限制的速度...
  • 即使您可以获得用户互联网的“官方”连接速度,但对于大多数实际情况来说,这个数字还是非常不准确。也许您应该重新考虑您需要这些信息的确切原因,并找到一种不同的方式来完成您真正想要做的任何事情。
  • 您的“流”带宽是否受到限制,或者您最终会以尽可能快的速度下载 1 个流,而以尽可能快的速度下载 10 个流(在这种情况下,您几乎没有任何收获)
  • 根据您的编辑,我认为您最好的选择是让 user 配置要使用的并行流的数量。我假设您正在做某种形式的文件共享应用程序?如果 BitTorrent 只是自动选择它允许多少传出或传入连接,你会有什么感觉?

标签: java connection performance


【解决方案1】:

我认为您可能以错误的方式思考问题。拍摄连接速度的快照仅表明它们在该时刻的吞吐量。当您运行占用他们带宽的测试时,他们很容易运行另一个应用程序,然后您的测量值一文不值。

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

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】:

您下载一个已知(且足够大)大小的文件需要多长时间。

如果下载 10MB 需要 60 秒,则您的连接速度为 (10 * 1024 * 8 / 60) Kbps 或 1365 Kbps。

【讨论】:

  • 唉,这只能用于确定与下载文件的服务器的连接速度,而不是原始发布者似乎想要的一般链接级传输速度。
  • ...是的,Randolpho 说的。
  • @Randolpho:您会为要与之通信的服务器执行此操作。所有其他链接速度都无关紧要。
  • 我同意,但正如我所指出的,最初的提问者想要链接级别的速度——没有人编写非驱动程序应该关心的东西。
【解决方案3】:

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

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

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

哦,请注意,您甚至可能在网上冲浪long distance

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多