2009-03-13 9 views
8

No quiero decir por las malas que internet no está disponible cuando capturo una excepción de url.openStream().¿Cómo pruebo la disponibilidad de Internet en Java?

¿Hay una manera simple de saber si la computadora está conectada a internet en Java? En este escenario, "conectado a internet" significa poder descargar datos de una url específica.

Si intento descargarlo y no está disponible, el programa se bloquea un poco. No quiero que eso cuelgue. Por lo tanto, necesito una forma rápida de consultar si el sitio web está disponible o no.

Respuesta

10

El problema que intenta evitar es esperar a que su conexión http determine que la URL a la que intenta acceder no está realmente disponible. Para lograr esto, debe dejar de usar url.openStream(), que es un atajo para openConnection(). GetInputStream() y obtener un control más preciso de su conexión.

URLConnection conn = url.openConnection(); 
conn.setConnectTimeout(timeoutMs); 
conn.setReadTimeout(timeoutMs); 
in = conn.getInputStream(); 

Este código le permitirá tiempo de espera del intento de conexión, si bien la conexión o la lectura excede el tiempo que usted proporciona en el parámetro de timeoutMs.

+0

esto es solo una solución mediocre porque todavía obtendrás un "cuelgue" a menos que hagas esto en otro hilo. – Chii

+0

¿Puedes sugerir uno mejor? Ya estoy usando un hilo separado para descargar los datos. – Penchant

2

Es posible que pueda saber si un compouter está conectado a una red, pero incluso si no hay garantía de que la red esté funcionando o de que esté conectado a internet.

Este es uno de esos problemas de "chupar y ver".

¿Qué hay de malo en intentar conectar? ¿Y por qué te preocupa si están o no conectados a Internet?

4

No existe la "disponibilidad de Internet". Imagine que su solicitud HTTP pasa por un proxy HTTP transparente, está intentando acceder a un sitio de la lista negra y recibe una respuesta HTTP del servidor proxy que le informa sobre el acceso denegado. ¿Está disponible Internet en este escenario o no?

Creo que deberás ser más específico sobre tu problema.

+0

Esta es una gran respuesta y un punto importante. – jayunit100

0

usted podría enviar un mensaje ICMP a un anfitrión muy conocida ...

+0

Muchas redes, particularmente redes corporativas, bloquean el tráfico ICMP. – cletus

+0

@cletus dijo que era muy "conocido" ... así que se supone que es un host que permite el tráfico ICMP :) – rogeriopvl

0

Puede comprobar si hay una NTP server si el servidor de seguridad no lo hace prohíbe.

De cualquier forma, creo que la mejor opción es tratar de abrir una URL mientras intenta evitarla, porque es el servicio que se abre más comúnmente.

Puede verificar si hay una o dos URL dinámicas que cambian constantemente. Por ejemplo, una web que muestra el tiempo. Por ejemplo, this one encontré googleing. Más de uno porque los sitios pueden estar abajo ;-)

1

No sé mucho sobre el nivel bajo de plomería HTTP disponible en Java, pero siempre se puede emitir una solicitud HTTP HEAD para la url con anticipación. Esto hace que el servidor envíe solo los encabezados y no los datos. Con un tiempo de espera de 1-3 segundos, debe poder evitar demoras prolongadas.

2

Si el criterio es si puede acceder a un servidor web determinado, la única forma de averiguarlo es accediendo a ese servidor web.

Sin embargo, puede hacerlo en una secuencia de fondo al inicio para que la aplicación no se demore. Luego, la respuesta "sí/no" está disponible cuando se desea la descarga real. Ponga un mensaje en la línea de estado para que el usuario sepa qué está sucediendo y no le sorprenda si no está iniciado "conectarse a la red" si no está conectado cuando se inicia su programa.

1

Si el programa se cuelga mientras espera la descarga, probablemente esté utilizando el hilo de la GUI para realizar la descarga. Si usa un hilo de fondo, su programa no se bloqueará, aunque demore un tiempo prolongado en descargarlo/descargarlo.

5

Uso

Process p1 = java.lang.Runtime.getRuntime().exec("ping www.google.com"); 
System.out.println(p1.waitFor()); 
// return code for p1 will be 0 if internet is connected, else it will be 1 
+0

Naga Rishi. Gracias. Buena respuesta. – pudaykiran

Cuestiones relacionadas