Не перечисляйте все ip lan [duplicate]

Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:

Предположим, что у вас есть класс с именем Student.

public class Student
{
    private string FirstName;
    private string LastName;
    public string GetFullName()
    {
        return FirstName + LastName;
    }
}

Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.

public class StudentInfo
{      
    public string GetStudentName()
    {
        Student s;
        string fullname = s.GetFullName();
        return fullname;
    }        
}

Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.

81
задан nwinkler 29 March 2012 в 11:12
поделиться

8 ответов

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

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

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

68
ответ дан Community 31 August 2018 в 15:45
поделиться

Метод «isReachable» во многих случаях не использовался для меня. Вы можете прокрутить страницу вниз, чтобы увидеть мою альтернативу для простого тестирования, если вы в сети и можете разрешать внешние хосты (например, google.com) ... Что обычно работает на машинах * NIX.

Проблема

Об этом много болтовни:

Часть 1: Воспроизводимый пример проблемы

Обратите внимание, что в этом случае он не работает ,

       //also, this fails for an invalid address, like "www.sjdosgoogle.com1234sd" 
       InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
      for (InetAddress address : addresses) {
        if (address.isReachable(10000))
        {   
           System.out.println("Connected "+ address);
        }
        else
        {
           System.out.println("Failed "+address);
        }
      }
          //output:*Failed www.google.com/74.125.227.114*

Часть 2: Hackish обходной путь

В качестве альтернативы вы можете сделать это:

// in case of Linux change the 'n' to 'c'
    Process p1 = java.lang.Runtime.getRuntime().exec("ping -n 1 www.google.com");
    int returnVal = p1.waitFor();
    boolean reachable = (returnVal==0);

Опция -c ping позволит ping просто попытаться добраться до сервера один раз (в отличие от бесконечного пинга, который мы использовали для использования на терминале).

Это вернет 0, если хост достижимы. В противном случае вы получите «2» в качестве возвращаемого значения.

Гораздо проще - но, конечно, это специфичная для платформы. И может быть некоторые предостережения о привилегиях для использования этой команды, но я нахожу, что это работает на моих машинах.


ПОЖАЛУЙСТА, обратите внимание: 1) Это решение не является качеством продукции. Это немного взломать. Если google не работает, или ваш интернет временно медленный, или, может быть, даже если есть какая-то забава в ваших привилегиях / системных настройках, если бы можно было вернуть ложные негативы (т. Е. Он мог выйти из строя, даже если входной адрес достигнут). 2) Ошибка isReachable является нерешенной проблемой. Опять же - есть несколько онлайн-ресурсов, указывающих на отсутствие «идеального» способа сделать это на момент написания этой статьи, из-за того, как JVM пытается достичь хостов - я думаю, что это неотъемлемо специфичная для платформы задача, которая, хотя и простая , еще недостаточно отвлечен JVM.

68
ответ дан Community 31 August 2018 в 15:45
поделиться
 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 31 August 2018 в 15:45
поделиться

Если вы хотите только проверить, подключен ли он к интернету, этот метод возвращает 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 31 August 2018 в 15:45
поделиться

Я не уверен, что было в состоянии, когда исходный вопрос был задан еще в 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 31 August 2018 в 15:45
поделиться

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

-1
ответ дан col 31 August 2018 в 15:45
поделиться

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

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

0
ответ дан cossoft 31 August 2018 в 15:45
поделиться

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

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 31 August 2018 в 15:45
поделиться
Другие вопросы по тегам:

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