Java достижим, не создавая того же результата, что и cmd ping [duplicate]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
81
задан nwinkler 29 March 2012 в 11:12
поделиться

7 ответов

Просто упоминать это явно, так как другие ответы не соответствуют. Для ping-части isReachable () требуется root-доступ в Unix. И как указано в 4779367 :

И если вы спросите, почему ping из bash этого не делает, на самом деле это тоже нужно. Сделайте это ls -l /bin/ping.

Поскольку использование root не было вариантом, в моем случае решение заключалось в том, чтобы разрешить доступ к порту 7 в брандмауэре на конкретный сервер, который мне интересен в.

67
ответ дан Community 28 August 2018 в 10:29
поделиться
 private boolean isReachable(int nping, int wping, String ipping) throws Exception {

    int nReceived = 0;
    int nLost = 0;

    Runtime runtime = Runtime.getRuntime();
    Process process = runtime.exec("ping -n " + nping + " -w " + wping + " " + ipping);
    Scanner scanner = new Scanner(process.getInputStream());
    process.waitFor();
    ArrayList<String> strings = new ArrayList<>();
    String data = "";
    //
    while (scanner.hasNextLine()) {
        String string = scanner.nextLine();
        data = data + string + "\n";
        strings.add(string);
    }

    if (data.contains("IP address must be specified.")
            || (data.contains("Ping request could not find host " + ipping + ".")
            || data.contains("Please check the name and try again."))) {
        throw new Exception(data);
    } else if (nping > strings.size()) {
        throw new Exception(data);
    }

    int index = 2;

    for (int i = index; i < nping + index; i++) {
        String string = strings.get(i);
        if (string.contains("Destination host unreachable.")) {
            nLost++;
        } else if (string.contains("Request timed out.")) {
            nLost++;
        } else if (string.contains("bytes") && string.contains("time") && string.contains("TTL")) {
            nReceived++;
        } else {
        }
    }

    return nReceived > 0;
}

nping - это число попыток ping ip (пакетов), если у вас занята сеть или системы, выберите более крупные номера. wping - это время ожидания понга из ip, вы можете установить его на 2000 мс для использования этого метода, и можете написать это:

isReachable(5, 2000, "192.168.7.93");
0
ответ дан Armin Mokri 28 August 2018 в 10:29
поделиться

Если вы хотите только проверить, подключен ли он к интернету, этот метод возвращает true, если интернет подключен, предпочтительнее, если вы используете адрес сайта, который вы пытаетесь подключить через программу.

     public static boolean isInternetReachable()
    {
        try {
            //make a URL to a known source
            URL url = new URL("http://www.google.com");

            //open a connection to that source
            HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();

            //trying to retrieve data from the source. If there
            //is no connection, this line will fail
            Object objData = urlConnect.getContent();

        } catch (Exception e) {              
            e.printStackTrace();
            return false;
        }

        return true;
    }
7
ответ дан CleanX 28 August 2018 в 10:29
поделиться

Я не уверен, что было в состоянии, когда исходный вопрос был задан еще в 2012 году.

Как сейчас, ping будет выполняться как корень. Через авторизацию ping исполняемого файла вы увидите флаг + s, а процесс, принадлежащий root, означает, что он будет запущен с правами root. запустите ls -liat, где находится ping, и вы увидите его.

Итак, если вы запустите InetAddress.getByName («www.google.com»). isReacheable (5000) как root, он должен return true.

вам нужны правильные авторизации для raw-сокета, который используется ICMP (протокол, используемый ping)

InetAddress.getByName так же надежен, как и ping, но вам нужно правильные разрешения на процесс, чтобы он работал правильно.

1
ответ дан Clebert Suconic 28 August 2018 в 10:29
поделиться

Поскольку вы можете пинговать компьютер, ваш Java-процесс должен работать с достаточными полномочиями для выполнения проверки. Возможно, из-за использования портов в нижнем диапазоне. Если вы запустите свою Java-программу с помощью sudo / superuser, я буду держать пари, что она работает.

-1
ответ дан col 28 August 2018 в 10:29
поделиться

Я бы предположил, что ТОЛЬКО надежный способ протестировать подключение к Интернету - это фактически подключиться и загрузить файл, или разобрать вывод вызова ping с помощью exec (). Вы не можете полагаться на код выхода для ping, а isReachable () - это дерьмо.

Вы не можете полагаться на код выхода ping, поскольку он возвращает 0, если команда ping выполняется правильно. К сожалению, ping выполняется правильно, если он не может дойти до целевого хоста, но получает «Destination host unreachable» от вашего домашнего ADSL-маршрутизатора. Это своего рода ответ, который обрабатывается как успешный хит, поэтому выходим из кода = 0. Имейте в виду, что это относится к системе Windows. Не проверено * nixes.

0
ответ дан cossoft 28 August 2018 в 10:29
поделиться

Я пришел сюда, чтобы получить ответ на этот же вопрос, но я был неудовлетворен любым из ответов, потому что искал независимое от платформы решение. Вот код, который я написал и независим от платформы, но требует информации о любом открытом порту на другом компьютере (который мы имеем большую часть времени).

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    // Any Open port on other machine
    // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
    try {
        try (Socket soc = new Socket()) {
            soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        }
        return true;
    } catch (IOException ex) {
        return false;
    }
}
31
ответ дан Sourabh Bhat 28 August 2018 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: