Java InetAddress.getByName возвращает имя хоста / ip, но это приводит к сбою пинга

#java

#java

Вопрос:

Я использую correto java 11 JDK

Вот мой метод:

 public static boolean sendPingRequest(String host)
{
    boolean value = false;

    try
    {
        InetAddress myip = InetAddress.getByName(host);
        System.out.println("Sending Ping Request to "   myip);

        if (myip.isReachable(5000))
        {

            System.out.println("Host: "   host   " is reachable");
            value = true;
        }
        else
        {

            System.out.println("Host: "   host   " is unreachable");
        }
    }
    catch (UnknownHostException e)
    {

        System.out.println("I can't reach this host: "   e.getMessage());
        e.printStackTrace();
    }
    catch (IOException e)
    {
        System.out.println("IO Exception"   e.getMessage());
    }
    return value;
}
  

Когда я могу использовать метод здесь, он терпит неудачу

 String myHost = "www.google.com";
sendPingRequest(myHost);
  

Отправка запроса Ping на www.google.com/108.177.111.106
Хост: www.google.com является недостижимым
Процесс завершен с кодом выхода 0

Из чтения документации похоже, что метод InetAddress.getByName возвращает это, но он будет терпеть неудачу каждый раз, если я не смогу заставить его показать, что хост имеет IP 108.177.111.106.

Ответ №1:

Я не могу воспроизвести вашу проблему. Вот что я пробовал:

 public class Main {

    public static void main(String[] args) {
        System.out.println(sendPingRequest("www.google.com"));
        System.out.println(sendPingRequest("74.125.195.106"));
        System.out.println(sendPingRequest("108.177.111.106"));
    }

    public static boolean sendPingRequest(String host) {
        boolean value = false;

        try {
            InetAddress myip = InetAddress.getByName(host);
            System.out.println("Sending Ping Request to "   myip);
            if (myip.isReachable(5000)) {
                System.out.println("Host: "   host   " is reachable");
                value = true;
            } else {
                System.out.println("Host: "   host   " is unreachable");
            }
        } catch (UnknownHostException e) {
            System.out.println("I can't reach this host: "   e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("IO Exception"   e.getMessage());
        }
        return value;
    }
}
  

и вывод

 Sending Ping Request to www.google.com/74.125.195.105
Host: www.google.com is reachable
true
Sending Ping Request to /74.125.195.106
Host: 74.125.195.106 is reachable
true
Sending Ping Request to /108.177.111.106
Host: 108.177.111.106 is reachable
true
  

Возможно, у вас были проблемы с сетью?

Комментарии:

1. это работает, когда я делаю это через командную строку, но не на java… Я могу ошибаться, но эта строка кода InetAddress myip = InetAddress.getByName(host); кажется, возвращает больше, чем ip, и вместо этого возвращает www.google.com/74.125.195.105 , если вы попытались выполнить пинг www.google.com/74.125.195.105 это потерпит неудачу…

2. команда ping (как в командной строке) действительно завершится неудачей, но, как вы можете видеть выше, возврат www.google.com/74.125.195.105 это не проблема, так как я тоже получал его, и это не было проблемой. Метод .isReachable не использует команду ping для отправки своих запросов на ping, но имеет свою собственную реализацию. Формат имени хоста / Ip — это просто строковое представление InetAddress . Он использует только IP для фактического выполнения своего пинга. Я не уверен, почему Java будет сбой, если вы можете выполнить пинг с помощью командной строки, но это определенно не то, что вы написали в своем коде.