Solución:
Debe conectarse al lugar que necesita su aplicación real. De lo contrario, está probando si tiene una conexión con algún lugar irrelevante (Google en este caso).
En particular, si está tratando de hablar con un servicio web, y si tiene el control del servicio web, sería una buena idea tener algún tipo de método web barato para “obtener el estado”. De esa manera, tendrá una idea mucho mejor de si es probable que su llamada “real” funcione.
En otros casos, basta con abrir una conexión a un puerto que debería estar abierto, o enviar un ping. InetAddress.isReachable
bien puede ser una API adecuada para sus necesidades aquí.
El código que proporcionaste básicamente, más una llamada a connect
debería ser suficiente. Entonces, sí, podría ser que Google no esté disponible, pero algún otro sitio con el que debes contactar sí lo esté, pero ¿qué tan probable es eso? Además, este código solo debe ejecutarse cuando no pueda acceder a su recurso externo (en un catch
bloquear para tratar de averiguar cuál fue la causa de la falla), así que diría que si tanto su recurso externo de interés y Google no está disponible, es probable que tenga un problema de conectividad de red.
private static boolean netIsAvailable() {
try {
final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
conn.connect();
conn.getInputStream().close();
return true;
} catch (MalformedURLException e) {
throw new RuntimeException(e);
} catch (IOException e) {
return false;
}
}
La gente ha sugerido usar INetAddress.isReachable. El problema es que algunos sitios configuran sus firewalls para bloquear los mensajes ICMP Ping. Por lo tanto, un “ping” puede fallar aunque se pueda acceder al servicio web.
Y, por supuesto, lo contrario también es cierto. Un host puede responder a un ping aunque el servidor web esté inactivo.
Y, por supuesto, es posible que una máquina no pueda conectarse directamente a ciertos (o todos) servidores web debido a las restricciones del firewall local.
El problema fundamental es que “puede conectarse a Internet” es una pregunta mal definida, y este tipo de cosas es difícil de probar sin:
- información sobre la máquina del usuario y el entorno de red “local”, y
- información sobre a qué necesita acceder la aplicación.
Entonces, en general, la solución más simple es que una aplicación simplemente intente acceder a lo que necesite para acceder y recurra a la inteligencia humana para hacer el diagnóstico.