Пинг с Java для мультиплатформенности - PullRequest
7 голосов
/ 30 мая 2011

Мне нужно выполнить ping на какой-нибудь ip / machine. Код может быть выполнен на любой платформе (Windows, Linux, Mac), и мне нужно получить информацию о потере и времени туда и обратно. Так что Java-пинг ping не достаточно хорош, потому что тогда мне нужно проанализировать ping-ответ как строку, которая отличается для каждой платформы и для языка ОС. так что мне нужно сделать? Я знаю, что есть что-то вроде JNI, но я новичок в Java, поэтому здесь нужна небольшая помощь. это все еще означает, что мне нужно иметь собственную реализацию для каждой платформы? Есть примеры или предложения?

Ответы [ 4 ]

5 голосов
/ 30 мая 2011

Поскольку java не зависит от платформы, вы можете спросить, какая ОС у вас установлена ​​System.getProperty("os.name") и проанализировать ответ или определить команду в соответствии с ней.

В качестве альтернативы вы можете использовать isReachable(int timeout) в InetAddressкоторая кажется наиболее близкой к реализации ICMP ECHO REQUEST, но она не предоставит вам информацию о потере и времени прохождения туда-обратно.

Еще одной идеей будет использование tracert / tracepath вместо ping для получения раундапоездка?проверьте эту тему для получения дополнительной информации.

1 голос
/ 30 мая 2011

Вы не можете сделать настоящий ICMP с чистой Java. Впрочем, достаточно переносимая jpcap библиотека обеспечивает приятный интерфейс Java для собственных библиотек, включая ICMP (ping).

0 голосов
/ 22 июня 2011

Я использовал JNI для получения команды ping. Я реализовал пинг с использованием native (C), а затем обернул его JNI. Понижение в том, что нужно компилировать C dll для каждой платформы.

0 голосов
/ 30 мая 2011

Полагаю, разбор все еще остается самым простым вариантом.Я был бы удивлен, если бы вам понадобилось больше, чем это регулярное выражение:

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

В скобках вы получите время, например 1 или 14 или 1.239, которое можно подать на Float.parseFloat().

...