2011-05-30 27 views
7

Necesito realizar ping a alguna ip/máquina. El código se puede ejecutar en cualquier tipo de plataforma (windows, linux, mac) y necesito obtener la información sobre la pérdida y el tiempo de ida y vuelta. por lo que el comando ping de java no es lo suficientemente bueno porque entonces tengo que analizar la respuesta del ping como cadena, que es diferente por plataforma y por idioma del sistema operativo. entonces, ¿qué debo hacer? Sé que hay algo así como JNI, pero soy nuevo en Java, así que necesito un poco de ayuda aquí. todavía significa que necesito tener una implementación nativa por plataforma? ¿Algún ejemplo o sugerencia?Ping con java a multiplataforma

+0

He usado JNI para obtener el comando ping. – Sophie

Respuesta

0

He usado JNI para obtener el comando ping. Implementé el ping usando native (C) y luego lo envolví con JNI. La versión anterior es la necesidad de compilar el dll C por plataforma.

1

No puede hacer ICMP real con Java puro. Sin embargo, la biblioteca razonablemente portátil jpcap proporciona una agradable interfaz Java para bibliotecas nativas, que incluye ICMP (ping).

0

Supongo que el análisis sigue siendo su opción más fácil. Yo estaría sorprendido si necesitara más de esta expresión regular:

time[<=]([0-9.]+)[ ]?ms 

encerrados entre paréntesis obtendrá el tiempo como 1 o 14 o 1.239 que puede ser alimentado a Float.parseFloat().

+1

Sí, ¿pero si el sistema operativo está en italiano? Chino? entonces "tiempo" no funcionará. – Sophie

+0

Ahora que es un problema, el orden de los parámetros no cambia. Tienes el modo Windows y el modo UNIX. – vbence

+0

También: ¿tienes que PING literalmente el servidor? Puede ser un servidor de eco UDP especial es suficiente. (Si tiene control sobre el servidor). – vbence

5

Dado que Java no es independiente de la plataforma, puede preguntar qué sistema operativo tiene utilizando el System.getProperty("os.name") y analizar la respuesta o definir el comando de acuerdo con ella.

Como alternativa, puede usar isReachable(int timeout) en InetAddress que parece ser la implementación más cercana a la PETICIÓN DE ECO DE ICMP, pero no le proporcionará la información sobre la pérdida y el tiempo de ida y vuelta.

Otra idea sería utilizar tracert/tracepath en lugar de ping para obtener el viaje redondo? marque this thread para obtener más información.

+1

isReachable: es el mejor esfuerzo; si icmp no funciona, cambia a TCP. – Sophie