在我的Java应用程序中,如何检测Internet连接速度有多快?例如,我在家里使用AT& T Fast DSL,我想知道是否有办法可以编写一个方法来执行以下操作:
int getInternetConnectionSpeed()
{
...
}
将以kbps为单位返回一个数字,例如2800kbps [2.8 M]
编辑: 我问的原因是,在我的应用程序中,我可以打开多个Internet流,具体取决于用户的Internet连接速度,我希望它自动确定打开多少流而不会阻塞应用程序。
答案 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)
但是根据您想要连接的位置,有很多速度:
由于您的JVM使用使用本地网络的本地PC,因此无法自动获得DSL速度。
哦,请注意,你甚至可能正在冲浪long distance!