2011-10-07 17 views
16

Quiero probar si un sistema remoto es accesible usando Java o en otras palabras, "enviar un ping" usando Java. Esta funcionalidad debe ser encapsulado en un método con el valor booleano, por ejemploCómo probar si un sistema remoto es alcanzable

public boolean isReachable(String ip) { 
    // what to do :-) 
} 

He probado la clase Process Java, pero no creo que es la mejor manera de hacer esto, debido a la compleja manejo de salida con OutputBuffers.

Process proc = Runtime.getRuntime().exec("ping " + ip); 

Otra posibilidad sería la creación de una conexión de socket y manejar excepciones lanzadas, pero si el sistema remoto es un sistema Unix "desnudo", podría no haber zócalo en el otro lado :-) Además, me gustaría gusta poder establecer un tiempo de espera, cuando un sistema remoto no es alcanzable.

Entonces, ¿cómo podría hacer esto? ¡Gracias!

+0

¿Para qué? Si hay un servidor allí al que desea conectarse, intente conectarse. – EJP

Respuesta

34
InetAddress.getByName(ip).isReachable(timeout); 
+1

¡OMG! Muchas gracias :-) EXACTAMENTE lo que estaba buscando! – strauberry

+5

¿podemos verificar si un puerto específico es alcanzable? – tasomaniac

+0

@tasomaniac intente algo como esto: http://pastebin.com/DuwZ6s5E (no probado) – scotty86

9

InetAddress.getByName(host).isReachable(timeOut) (visto here)

+6

No se puede confiar en que isReachable() haga ping a los hosts fuera de la subred local. La razón más probable es que Windows esté usando ping ICMP mientras que isReachable() no lo usa. Este es el caso hasta al menos Java 6. – flash

+5

Hay un comentario en la implementación del método nativo 'isReachable0' (en' Inet4AddressImpl.c) que dice "La implementación de Windows de los zócalos ICMP y RAW es muy poco confiable por ahora. Por lo tanto, es mejor no probarlo y confiar únicamente en TCP. Podemos revisar y habilitar este código en el futuro ". ' –

+0

Confirmado, en mi máquina de prueba WXP, este comando adopta de manera predeterminada una conexión TCP en el puerto 7 (eco). Devuelve accesible incluso para IP que no existen, o con el firewall bloqueado. –

4

Parece que está usando Linux por lo que probablemente encontrará que isReachable() es poco fiable (ya que no tendrá permisos para enviar paquetes ICMP, y muy algunos servidores tienen el servicio Echo funcionando).

Si ese es el caso, entonces creo que se que usar generar un proceso en la forma en que usted sugiere, pero yo recomiendo usar un comando como:

ping -c 1 hostname 

Esto terminará después de un intento y luego puede examinar el estado de salida del proceso, mucho más confiable que analizar la salida estándar.

Ping devuelve 0 para el éxito distinto de cero en caso de error.

+0

¡Muchas gracias por este consejo! Crearé una entrada en el rastreador de errores como "mejora" :-) – strauberry

0

Sé que esta pregunta ha encontrado su respuesta, pero me gustaría añadir mi código solo para "copiar y pegar".

public boolean isIpReachable(String ip, int timeout){ 
    boolean state = false; 

    try { 
     state = InetAddress.getByName(ip).isReachable(timeout); 
    } catch (IOException e) { 
     //Parse error here 
    } 

    return state; 
} 
Cuestiones relacionadas