Как получить список IP-адресов, подключенных в одной сети (подсети) с использованием Java - PullRequest
40 голосов
/ 27 июля 2010

Как получить список IP-адресов для устройств, подключенных к моей подсети с использованием Java?

Ответы [ 7 ]

46 голосов
/ 27 июля 2010

это должно работать, когда хосты в вашей сети реагируют на пакеты ICMP (ping) (> JDK 5):

public void checkHosts(String subnet){
   int timeout=1000;
   for (int i=1;i<255;i++){
       String host=subnet + "." + i;
       if (InetAddress.getByName(host).isReachable(timeout)){
           System.out.println(host + " is reachable");
       }
   }
}

вызовите метод для подсети (192.168.0.1-254) следующим образом:

checkHosts("192.168.0");

не проверял, но должно работать примерно так. Очевидно, это проверяет только 254 хоста в последнем байте IP-адреса ...

проверка:

http://download -llnw.oracle.com / JavaSE / 6 / документы / API / Java / сеть / InetAddress.html # isReachable% 28int% 29 http://blog.taragana.com/index.php/archive/how-to-do-icmp-ping-in-java-jdk-15-and-above/

надеюсь, что помогло

5 голосов
/ 27 июля 2010

Для просмотра списка хостов, подключенных к локальной сети, вам необходимо пропинговать все доступные IP-адреса в подсети. Но сообщение ping может быть ограничено брандмауэром, поэтому более безопасным способом может быть открытие сокета для каждого IP-адреса в диапазоне IP-адресов локальной сети.

3 голосов
/ 29 декабря 2015

Показывает активные адреса в локальной сети

public static void main(String[] args) {
    try {
        Enumeration nis = NetworkInterface.getNetworkInterfaces();
        while(nis.hasMoreElements())
        {
            NetworkInterface ni = (NetworkInterface) nis.nextElement();
            Enumeration ias = ni.getInetAddresses();
            while (ias.hasMoreElements())
            {
                InetAddress ia = (InetAddress) ias.nextElement();
                System.out.println(ia.getHostAddress());
            }

        }
    } catch (SocketException ex) {
        Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
    }
}

выход

127.0.0.1
0:0:0:0:0:0:0:1
172.128.1.102
1 голос
/ 27 июля 2010

Начиная с Java 1.5, в java.net есть метод, похожий на ping.InetAddress: public boolean isReachable (int timeout).Вы можете использовать это для перебора всех IP-адресов в вашей подсети ... java-doc

1 голос
/ 27 июля 2010

Если вы имеете в виду список всех хостов, подключенных к сети, я думаю, что единственный гарантированный способ работы - это просмотреть список IP-адресов и пропинговать их все.

При этом еслиВы ищете что-то более конкретное, может быть что-то, что вы можете посмотреть (например, реестр RMI (LocateRegistry.getRegistry(host, port).list()).

Кроме того, если вы просто хотите, чтобы все IP-адреса, которые есть у данного хоста, имеливзгляд на NetworkInterface.getNetworkInterfaces().

0 голосов
/ 17 декабря 2018

Ничего из этого не работало для меня, так как я создал сервер, и он не отвечал на эти запросы. Поэтому я создал механизм, который заставляет сервер отвечать на эхо-запрос, и использовал метод проверки методом грубой силы для всех адресов в подсети.

PS: Написание этого потому, что кому-то, создающему свой собственный сервер, это может понадобиться.

0 голосов
/ 28 июля 2010

Одна из проблем здесь заключается в том, что ни один из терминов «LAN» и «подключенный» не имеет значения в TCP / IP. Предлагаемый метод вызова isReachable () на всех хостах в подсети класса D может работать, если ваша локальная сеть точно соответствует подсети класса D.

Возможно, вам лучше взглянуть на SAMBA, которая может опрашивать членов ЛВС через SMB, поэтому, по крайней мере, вы будете использовать технику, которая имеет то же значение для ЛВС, что и вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...