2010-11-08 41 views
5

En mi aplicación Java, ¿cómo puedo detectar qué tan rápido es la velocidad de conexión a Internet? Por ejemplo, yo uso en & T DSL rápido en casa, me pregunto si hay alguna manera de escribir un método que hace lo siguiente:Cómo detectar la velocidad de conexión a Internet con Java?

int getInternetConnectionSpeed() 
{ 
    ... 
} 

que devolverá un número en kbps, algo así como 2800kbps [2.8 M]

Edit: La razón por la que estoy preguntando es en mi aplicación, puedo abrir varias transmisiones de Internet, dependiendo de la velocidad de conexión de Internet de los usuarios, quiero que determine automáticamente cuántas secuencias abrir sin bloquear la aplicación.

+0

Creo que para que esto realmente funcione tendría que tener un servidor en el otro extremo de su prueba que pueda manejar velocidades superiores al límite máximo de su conexión de AT & T ... – FrustratedWithFormsDesigner

+0

Incluso si pudiera obtener el "funcionario" "velocidad de conexión para los internets del usuario, ese número sería muy impreciso para la mayoría de los escenarios del mundo real". Tal vez debería reconsiderar exactamente por qué necesita esta información y encontrar una forma diferente de hacer lo que sea que * realmente * esté tratando de hacer. – Randolpho

+0

¿Su ancho de banda de "streams" está limitado, o terminará con una descarga de stream lo más rápido posible contra 10 streams descargando tan rápido como sea posible (en cuyo caso apenas gana nada) – nos

Respuesta

2

Creo que podría estar pensando en el problema de la manera incorrecta. Tomar una instantánea de una velocidad de conexión es solo una indicación de su rendimiento en ese instante en el tiempo. Podrían fácilmente ejecutar otra aplicación cuando ejecutas una prueba que absorbe su ancho de banda y luego tus valores medidos no tienen valor.

En su lugar, creo que debería agregar o eliminar subprocesos constantemente según aumente o disminuya su rendimiento. Me gustaría sugerir algo como esto (sólo pseudo código):

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); 
     } 
    } 
    } 
} 

Puede jugar con los horarios de sueño para adaptarse. Supongo que getCurrentSpeed() devuelve el rendimiento de todos los hilos de descarga y que puede abrir y cerrar dinámicamente subprocesos durante la ejecución de la aplicación.

+2

¡Gracias, esa es una forma inteligente de despellejar a un gato! – Frank

+0

Probablemente desee utilizar un grupo de subprocesos para administrar los subprocesos. – Holly

1

Tiempo cuánto tiempo le lleva descargar un archivo de tamaño conocido (y suficientemente grande).

Si le lleva 60 segundos descargar 10MB, tiene una conexión de (10 * 1024 * 8/60) Kbps o 1365 Kbps.

+2

Desgraciadamente, eso solo funcionaría para determinar la velocidad de conexión al servidor desde el que se descargó el archivo, no la velocidad de transferencia de nivel de enlace general que parece desear el póster original. – Randolpho

+0

... sí, lo que dijo Randolpho. – FrustratedWithFormsDesigner

+1

@Randolpho: lo haría por el servidor con el que se estaría comunicando. Todas las demás velocidades de enlace son irrelevantes. –

1

Pero hay muchas velocidades en función de la que desea conectarse:

  • 127.0.0.1?
  • ¿Su subred local?
  • ¿Su conexión a internet?

Dado que su JVM usa la PC local que usa la red local, no hay forma de obtener la velocidad de DSL automáticamente.

Ah, y tenga en cuenta que incluso podría estar navegando long distance!

Cuestiones relacionadas