Ответ 1
Вы не можете просто ping в Java, поскольку он полагается на ICMP, который, к сожалению, не поддерживается в Java
http://mindprod.com/jgloss/ping.html
Вместо этого используйте сокеты
Надеюсь, что это поможет
Я использую эту часть кода для ping ip-адреса в java, но только pinging localhost успешно, а для других хостов программа говорит, что хост недоступен. Я отключил свой брандмауэр, но все еще имею эту проблему
public static void main(String[] args) throws UnknownHostException, IOException {
String ipAddress = "127.0.0.1";
InetAddress inet = InetAddress.getByName(ipAddress);
System.out.println("Sending Ping Request to " + ipAddress);
System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable");
ipAddress = "173.194.32.38";
inet = InetAddress.getByName(ipAddress);
System.out.println("Sending Ping Request to " + ipAddress);
System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable");
}
Вывод:
Отправка запроса Ping на 127.0.0.1
Хост доступен - Отправка запроса Ping на 173.194.32.38
Хост недоступен
Вы не можете просто ping в Java, поскольку он полагается на ICMP, который, к сожалению, не поддерживается в Java
http://mindprod.com/jgloss/ping.html
Вместо этого используйте сокеты
Надеюсь, что это поможет
InetAddress.isReachable()
в соответствии с javadoc:
". Типичная реализация будет использовать запросы ICMP ECHO, если привилегия может быть получена, в противном случае она попытается установить TCP соединение на порту 7 (Echo) хоста назначения.".
Вариант № 1 (ICMP) обычно требует административных (root)
прав.
Я думаю, что этот код поможет вам:
public class PingExample {
public static void main(String[] args){
try{
InetAddress address = InetAddress.getByName("192.168.1.103");
boolean reachable = address.isReachable(10000);
System.out.println("Is host reachable? " + reachable);
} catch (Exception e){
e.printStackTrace();
}
}
}
Проверьте свои возможности подключения. На моем компьютере это печатает REACHABLE для обоих IP-адресов:
Отправка запроса Ping на 127.0.0.1
Хост доступен - Отправка запроса Ping на 173.194.32.38
Хост доступен
EDIT:
Вы можете попробовать изменить код для использования getByAddress() для получения адреса:
public static void main(String[] args) throws UnknownHostException, IOException {
InetAddress inet;
inet = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 });
System.out.println("Sending Ping Request to " + inet);
System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable");
inet = InetAddress.getByAddress(new byte[] { (byte) 173, (byte) 194, 32, 38 });
System.out.println("Sending Ping Request to " + inet);
System.out.println(inet.isReachable(5000) ? "Host is reachable" : "Host is NOT reachable");
}
Методы getByName() могут попытаться выполнить какой-либо обратный поиск DNS, который может быть невозможен на вашем компьютере, getByAddress() может обойти это.
Это будет работать наверняка
import java.io.*;
import java.util.*;
public class JavaPingExampleProgram
{
public static void main(String args[])
throws IOException
{
// create the ping command as a list of strings
JavaPingExampleProgram ping = new JavaPingExampleProgram();
List<String> commands = new ArrayList<String>();
commands.add("ping");
commands.add("-c");
commands.add("5");
commands.add("74.125.236.73");
ping.doCommand(commands);
}
public void doCommand(List<String> command)
throws IOException
{
String s = null;
ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
// read the output from the command
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null)
{
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null)
{
System.out.println(s);
}
}
}
Вы можете использовать этот метод для проверки связи хостов на Windows и других платформах:
private static boolean ping(String host) throws IOException, InterruptedException {
boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win");
ProcessBuilder processBuilder = new ProcessBuilder("ping", isWindows? "-n" : "-c", "1", host);
Process proc = processBuilder.start();
int returnVal = proc.waitFor();
return returnVal == 0;
}
Просто добавление к тому, что дали другие, хотя они работают хорошо, но , в некоторых случаях, если интернет медленный или существует некоторая неизвестная сетевая проблема, некоторые из кодов не будут работать (isReachable()
). Но этот код, упомянутый ниже, создает процесс, который выступает в качестве командной строки ping (cmd ping) для окон. Он работает для меня во всех случаях, проверен и проверен.
Код: -
public class JavaPingApp {
public static void runSystemCommand(String command) {
try {
Process p = Runtime.getRuntime().exec(command);
BufferedReader inputStream = new BufferedReader(
new InputStreamReader(p.getInputStream()));
String s = "";
// reading output stream of the command
while ((s = inputStream.readLine()) != null) {
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String ip = "stackoverflow.com"; //Any IP Address on your network / Web
runSystemCommand("ping " + ip);
}
}
Надеюсь, это поможет, Cheers!!!
Несмотря на то, что это не зависит от ICMP в Windows, эта реализация довольно хорошо работает с новым API продолжительности
public static Duration ping(String host) {
Instant startTime = Instant.now();
try {
InetAddress address = InetAddress.getByName(host);
if (address.isReachable(1000)) {
return Duration.between(startTime, Instant.now());
}
} catch (IOException e) {
// Host not available, nothing to do here
}
return Duration.ofDays(1);
}
В linux с oracle-jdk код, отправленный OP, использует порт 7, если не root и ICMP, когда root. Он выполняет реальный ICMP-запрос эха при запуске с правами root, как указано в документации.
Если вы запускаете это на компьютере MS, вам может потребоваться запустить приложение в качестве администратора, чтобы получить поведение ICMP.
Ниже приведен метод для проверки IP-адреса в Java
, который должен работать с системами Windows
и Unix
:
import org.apache.commons.lang3.SystemUtils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class CommandLine
{
/**
* @param ipAddress The internet protocol address to ping
* @return True if the address is responsive, false otherwise
*/
public static boolean isReachable(String ipAddress) throws IOException
{
List<String> command = buildCommand(ipAddress);
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start();
try (BufferedReader standardOutput = new BufferedReader(new InputStreamReader(process.getInputStream())))
{
String outputLine;
while ((outputLine = standardOutput.readLine()) != null)
{
// Picks up Windows and Unix unreachable hosts
if (outputLine.toLowerCase().contains("destination host unreachable"))
{
return false;
}
}
}
return true;
}
private static List<String> buildCommand(String ipAddress)
{
List<String> command = new ArrayList<>();
command.add("ping");
if (SystemUtils.IS_OS_WINDOWS)
{
command.add("-n");
} else if (SystemUtils.IS_OS_UNIX)
{
command.add("-c");
} else
{
throw new UnsupportedOperationException("Unsupported operating system");
}
command.add("1");
command.add(ipAddress);
return command;
}
}
Обязательно добавьте Apache Commons Lang
к вашим зависимостям.
Я знаю, что на это были ответы с предыдущими записями, но для всех, кто приходит к этому вопросу, я нашел способ, который не требовал использования процесса "ping" в Windows, а затем очистки данных.
Что я сделал, так это использование JNA для вызова библиотеки вспомогательного окна Window IP для выполнения ICMP-эха
Посмотрите мой собственный ответ на мою собственную аналогичную проблему
InetAddress не всегда возвращает правильное значение. Он успешен в случае локального хоста, но для других хостов это показывает, что хост недоступен. Попробуйте использовать команду ping, как указано ниже.
try {
String cmd = "cmd /C ping -n 1 " + ip + " | find \"TTL\"";
Process myProcess = Runtime.getRuntime().exec(cmd);
myProcess.waitFor();
if(myProcess.exitValue() == 0) {
return true;
}
else {
return false;
}
}
catch (Exception e) {
e.printStackTrace();
return false;
}
Я попробовал пару вариантов:
InetAddress.getByName(ipAddress)
, сеть в Windows начала работать неправильно после нескольких попыток
Java HttpURLConnection
URL siteURL = new URL(url);
connection = (HttpURLConnection) siteURL.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(pingTime);
connection.connect();
code = connection.getResponseCode();
if (code == 200) {
code = 200;
}.
Это было надежно, но немного медленно
Я наконец-то решил создать пакетный файл на моем компьютере с Windows со следующим содержимым: ping.exe -n %echoCount% %pingIp%
Затем я вызвал .bat файл в своем Java-коде, используя
public int pingBat(Network network) {
ProcessBuilder pb = new ProcessBuilder(pingBatLocation);
Map<String, String> env = pb.environment();
env.put(
"echoCount", noOfPings + "");
env.put(
"pingIp", pingIp);
File outputFile = new File(outputFileLocation);
File errorFile = new File(errorFileLocation);
pb.redirectOutput(outputFile);
pb.redirectError(errorFile);
Process process;
try {
process = pb.start();
process.waitFor();
String finalOutput = printFile(outputFile);
if (finalOutput != null && finalOutput.toLowerCase().contains("reply from")) {
return 200;
} else {
return 202;
}
} catch (IOException e) {
log.debug(e.getMessage());
return 203;
} catch (InterruptedException e) {
log.debug(e.getMessage());
return 204;
}
}
Это оказался самый быстрый и надежный способ
Это должно работать:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Pinger {
private static String keyWordTolookFor = "average";
public Pinger() {
// TODO Auto-generated constructor stub
}
public static void main(String[] args) {
//Test the ping method on Windows.
System.out.println(ping("192.168.0.1")); }
public String ping(String IP) {
try {
String line;
Process p = Runtime.getRuntime().exec("ping -n 1 " + IP);
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while (((line = input.readLine()) != null)) {
if (line.toLowerCase().indexOf(keyWordTolookFor.toLowerCase()) != -1) {
String delims = "[ ]+";
String[] tokens = line.split(delims);
return tokens[tokens.length - 1];
}
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
return "Offline";
}
}