InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
¿Por qué isReachable
vuelve false
? Puedo hacer ping a la IP.
java
inetaddress
jiafu
fuente
fuente
Respuestas:
El método "isReachable" no ha sido digno de usar para mí en muchos casos. Puede desplazarse hasta la parte inferior para ver mi alternativa para simplemente probar si está en línea y es capaz de resolver hosts externos (es decir, google.com) ... que generalmente parece funcionar en máquinas * NIX.
La cuestión
Hay mucha charla sobre esto:
Aquí hay otras preguntas similares:
Detectar la conexión a Internet usando Java
¿Cómo pruebo la disponibilidad de Internet en Java?
E incluso un error informado sobre este mismo asunto:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4921816
Parte 1: un ejemplo reproducible del problema
Tenga en cuenta que en este caso, falla.
Parte 2: una solución hackish
Como alternativa, puede hacer esto:
La opción -c de ping permitirá que ping simplemente intente llegar al servidor una vez (a diferencia del ping infinito que estamos acostumbrados a usar en la terminal).
Esto devolverá 0 si el host es accesible . De lo contrario, obtendrá "2" como valor de retorno.
Mucho más simple, pero por supuesto es específico de la plataforma. Y puede haber ciertas advertencias de privilegio para usar este comando, pero encuentro que funciona en mis máquinas.
TENGA EN CUENTA QUE: 1) Esta solución no es de calidad de producción. Es un truco. Si Google está inactivo, o su Internet está temporalmente lento, o tal vez incluso si hay algo de gracia en sus privilegios / configuración del sistema, podría devolver falsos negativos (es decir, podría fallar aunque la dirección de entrada sea accesible). 2) La falla de isReachable es un problema pendiente. Nuevamente, hay varios recursos en línea que indican que no existe una forma "perfecta" de hacer esto en el momento de escribir este artículo, debido a la forma en que la JVM intenta llegar a los hosts, supongo que es una tarea intrínsecamente específica de la plataforma que, aunque simple , aún no ha sido extraído lo suficiente por la JVM.
fuente
isReachable
si estoy fallando y usando ping, ¿no se permite icmp? ¿Sabes cómo lidiar con eso ahora?public boolean waitFor(long timeout, TimeUnit unit)
en java.lang.Process (@since 1.8)isReachable
sea más confiable hoy en día.Vine aquí para obtener una respuesta para esta misma pregunta, pero no estaba satisfecho con ninguna de las respuestas porque estaba buscando una solución independiente de la plataforma. Aquí está el código que escribí y es independiente de la plataforma, pero requiere información sobre cualquier puerto abierto en la otra máquina (que tenemos la mayor parte del tiempo).
fuente
InetAddress.isReachable()
ya hace, a través del puerto 7, excepto que este último es más inteligente sobre lo que los diversos posiblesIOExceptions
significan en términos de accesibilidad.InetAddress.isReachable()
se sobrecargara para incluir el argumento del puerto, en la biblioteca estándar. Me pregunto por qué no estaba incluido.Si solo desea verificar si está conectado a Internet, use este método. Devuelve verdadero si Internet está conectado. Es preferible si usa la dirección del sitio al que está intentando conectarse a través del programa.
fuente
Solo mencionándolo explícitamente ya que las otras respuestas no lo hacen. La parte de ping de isReachable () requiere acceso de root en Unix. Y como lo señala bestsss en 4779367 :
Dado que usar root no era una opción en mi caso, la solución fue permitir el acceso al puerto 7 en el firewall para el servidor específico que me interesaba.
fuente
No estoy seguro de cuál era el estado cuando se hizo la pregunta original en 2012.
Tal como está ahora, ping se ejecutará como root. A través de la autorización del ejecutable ping, verá el indicador + s, y el proceso que pertenece a root, lo que significa que se ejecutará como root. ejecute ls -liat donde se encuentra el ping y debería verlo.
Por lo tanto, si ejecuta InetAddress.getByName ("www.google.com"). IsReacheable (5000) como root, debería devolver verdadero.
necesita las autorizaciones adecuadas para el socket sin procesar, que es utilizado por ICMP (el protocolo utilizado por ping)
InetAddress.getByName es tan confiable como ping, pero necesita los permisos adecuados en el proceso para que se ejecute correctamente.
fuente
Sugeriría que la ÚNICA forma confiable de probar una conexión a Internet es conectarse Y descargar un archivo, O analizar la salida de una llamada de ping del sistema operativo a través de exec (). No puede confiar en el código de salida para hacer ping e isReachable () es una mierda.
No puede confiar en un código de salida de ping, ya que devuelve 0 si el comando ping se ejecuta correctamente. Desafortunadamente, el ping se ejecuta correctamente si no puede alcanzar el host de destino, pero obtiene un "Host de destino inalcanzable" de su enrutador ADSL doméstico. Esta es una especie de respuesta que se trata como un acierto exitoso, por lo tanto, código de salida = 0. Sin embargo, debo agregar que esto es en un sistema Windows. No marcado * nixes.
fuente
fuente
O usando de esta manera:
fuente
InetAddress.isReachable
es flappy y, a veces, devuelve inalcanzable para direcciones a las que podemos hacer ping.Intenté lo siguiente:
ping -c 1 <fqdn>
y compruebe elexit status
.Funciona para todos los casos que probé donde
InetAddress.isReachable
no funciona.fuente
Como puede hacer ping a la computadora, su proceso de Java debe ejecutarse con privilegios suficientes para realizar la verificación. Probablemente debido al uso de puertos en el rango inferior. Si ejecuta su programa java con sudo / superuser, apuesto a que funciona.
fuente