Как выполнить ping IP-адрес

Я использую эту часть кода для 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
Хост недоступен

13 ответов


вы не можете просто пинговать на Java, поскольку он полагается на ICMP, который, к сожалению, не поддерживается в Java

http://mindprod.com/jgloss/ping.html

используйте сокеты вместо

надеюсь, это поможет


InetAddress.isReachable() по данным javadoc:

".. Типичная реализация будет использовать эхо-запросы ICMP, если привилегия может быть получена, в противном случае он будет пытаться установить 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();
        }
    }
}

проверьте подключение. На моем компьютере это печатает достижимый для обоих IP:

отправка запроса Ping в 127.0.0.1
Хост -
Отправка запроса Ping в 173.194.32.38
Хост -

изменить:

можно попробовать изменить код, чтобы использовать 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);
    }
  }

}

вы можете использовать этот метод для ping хостов на 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) для windows. Это работает для меня во всех случаях, проверено и проверено.

код :-

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);
}
}

надеюсь, это поможет, Ура!!!


в linux с oracle-jdk код, представленный OP, использует порт 7, когда не root, и ICMP, когда root. Он выполняет реальный Эхо-запрос ICMP при запуске от имени root, как указано в документации.

Если вы используете это на машине MS, вам может потребоваться запустить приложение от имени администратора, чтобы получить поведение ICMP.


вот метод для pinging 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 для вызова вспомогательной библиотеки IP Window для выполнения ICMP echo

посмотреть мой собственный ответ на мой аналогичный вопрос


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;
}

хотя это не зависит от 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);
}

Это должно работать:

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";
}

}