Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

это должно работать, когда хосты вашей сети реагируют на пакеты 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/docs/api/java/net/InetAddress.html#isReachable%28int%29 http://blog.taragana.com/index.php/archive/how-to-do-icmp-ping-in-java-jdk-15-and-above/

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Получить список IP-адресов, отвечающих на пинги

Я сделал этот код для 64-битного Windows 7, используя Java jdk1.8.0_25.

Шаг 1: загрузите nmap для окон:

http://nmap.org/book/inst-windows.html

Шаг 2: убедитесь, что вы можете получить эти результаты в командной строке или в командной строке:

C:\Users\eric.leschinski>Nmap -sn -oG ip.txt 13.10.23.1-255
Starting Nmap 6.47 ( http://nmap.org ) at 2014-11-13 15:47 Eastern Standard Time
Nmap scan report for 13.10.23.1
Host is up (0.00s latency).
Nmap scan report for 13.10.23.11
Nmap done: 255 IP addresses (2 hosts up) scanned in 5.53 seconds
C:\Users\eric.leschinski>

Шаг 3. Создайте java-программу и включите этот метод:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public ArrayList<String> getIPAddressList(){
    ArrayList<String> addresses = new ArrayList<String>();
    try {
        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec("nmap -sn -oG ip.txt 13.150.23.1-255");
        BufferedReader input = new BufferedReader(
            new InputStreamReader(pr.getInputStream()));
        String line = null;
        while((line=input.readLine()) != null) {
            System.out.println(line);
            if (line.contains("Nmap scan report for")){
                String[] elements = line.split(" ");
                int end = elements.length-1;
                String ip_address = elements[end];
                String line2 = input.readLine();
                if (line2.contains("Host is up")){
                    addresses.add(ip_address);
                }
            }
        }

        int exitVal = pr.waitFor();
        System.out.println("Exited with error code "+exitVal);
    }
    catch(Exception e){
        e.printStackTrace();
        System.exit(0);
    }
    return addresses;
}

Шаг 4, оцените вывод

Распечатайте содержимое возвращаемого. Это список IP-адресов по IP-адресам, начиная с 13.150.23.1 по 13.150.23.255

Как быстро он проходит?

Для сканирования 255 адресов потребовалось около 4 секунд.

Ответ 5

Так как Java 1.5 есть пинг-подобный метод в java.net.InetAddress: public boolean isReachable (int timeout). Вы можете использовать это для итерации по всем IP-адресам в своей подсети... java-doc

Ответ 6

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

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

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

Ответ 7

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

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