vedere Come ottenere un elenco di IP connessi nella stessa rete(subnet) utilizzando Java




vedere indirizzi ip collegati alla rete mac (6)

Come posso ottenere l'elenco degli indirizzi IP per i dispositivi connessi alla mia stessa subnet utilizzando Java?


Da Java 1.5 esiste un metodo simile al ping in java.net.InetAddress: public boolean isReachable (int timeout). Si può usare per iterare su tutti gli indirizzi IP nella sottorete ... java-doc


Per elencare gli host connessi in una LAN è necessario eseguire il ping di tutti gli indirizzi IP disponibili nella subnet. Ma un messaggio ping potrebbe essere limitato dal firewall in modo tale che un modo più sicuro potrebbe essere aprire un socket per ciascun indirizzo IP nell'intervallo di indirizzi IP della LAN.


Mostra indirizzi attivi su LAN

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);
    }
}

Produzione

127.0.0.1
0:0:0:0:0:0:0:1
172.128.1.102

Se si intende un elenco di tutti gli host collegati alla rete, penso che l'unico modo in cui è garantito il funzionamento è quello di scorrere un elenco di indirizzi IP e ping tutti loro.

Detto questo, se stai cercando qualcosa di più specifico, potrebbe esserci qualcosa che puoi cercare (es. Registro di RMI ( LocateRegistry.getRegistry(host, port).list() ).

Inoltre, se desideri solo tutti gli indirizzi IP di un determinato host, dai un'occhiata a NetworkInterface.getNetworkInterfaces() .


Uno dei problemi qui è che nessuno dei termini "LAN" e "connesso" ha un significato in TCP / IP. La tecnica di chiamata suggerita èReachable () su tutti gli host nella subnet di classe D potrebbe funzionare se la tua LAN corrisponde precisamente a una subnet di classe D.

Potrebbe essere meglio guardare SAMBA, che può interrogare i membri della LAN tramite SMB, quindi almeno userete una tecnica che ha lo stesso significato per LAN che fate.


questo dovrebbe funzionare quando gli host della rete reagiscono ai pacchetti 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");
       }
   }
}

invocare il metodo per una sottorete (192.168.0.1-254) in questo modo:

checkHosts("192.168.0");

non l'ho provato ma dovrebbe funzionare un pò come questo. Ovviamente questo controlla solo i 254 host nell'ultimo byte dell'indirizzo ip ...

dai un'occhiata:

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/

spero che abbia aiutato





networking