Como obter uma lista de IPs conectados na mesma rede (sub-rede) usando Java

Como obtenho uma lista de endereços IP para dispositivos conectados à minha mesma sub-rede usando o Java?

isso deve funcionar quando os hosts em sua rede reagirem aos pacotes 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"); } } } 

invoque o método para uma sub-rede (192.168.0.1-254) assim:

 checkHosts("192.168.0"); 

não testei, mas deve funcionar meio assim. Obviamente, isso só verifica os 254 hosts no último byte do endereço IP ...

Verifica:

http://download-llnw.oracle.com/javase/6/docs/api/java/net/InetAddress.html#isReachable%28int%29 http://blog.taragana.com/index.php/archive/how -para-fazer-icmp-ping-in-java-jdk-15-e-acima /

Espero que tenha ajudado

Obter uma lista de endereços IP que estão respondendo a pings

Eu fiz este código para um Windows 7 64 bit usando Java jdk1.8.0_25.

Passo 1: baixe o nmap para o windows:

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

Etapa 2: verifique se você consegue obter esses resultados na linha de comando ou no powershell:

 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> 

Etapa 3: crie um programa java e inclua este método:

 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; public ArrayList getIPAddressList(){ ArrayList addresses = new ArrayList(); 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; } 

Etapa 4, avaliar a saída

Imprima o conteúdo do devolvido. É uma lista de endereços IP pelos endereços IP começando com 13.150.23.1 até 13.150.23.255

Quão rápido ele vai?

Demorou cerca de 4 segundos para analisar os 255 endereços.

Para listar os hosts conectados em uma LAN, você precisará executar ping em todos os endereços IP disponíveis na sub-rede. Mas uma mensagem de ping poderia ser restringida por firewall, portanto, uma maneira mais segura poderia ser abrir um soquete para cada endereço IP no intervalo de endereços IP da LAN.

Mostra endereços ativos na 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); } } 

Saída

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

Se você quer dizer uma lista de todos os hosts conectados à rede, acho que a única maneira garantida de funcionar é percorrer uma lista de endereços IP e fazer o ping de todos eles.

Dito isso, se você estiver procurando por algo mais específico, pode haver algo que você possa pesquisar (por exemplo, o registro do RMI ( LocateRegistry.getRegistry(host, port).list() ).

Além disso, se você quiser apenas todos os endereços IP que um determinado host possui, dê uma olhada em NetworkInterface.getNetworkInterfaces() .

Desde o Java 1.5, existe um método semelhante a ping em java.net.InetAddress: public boolean isReachable (int timeout). Você poderia usá-lo para iterar todos os endereços IP da sua sub – rede … java-doc

Um dos problemas aqui é que nenhum dos termos “LAN” e “conectado” tem um significado no TCP / IP. A técnica sugerida de chamar isReachable () em todos os hosts na sub-rede da class D pode funcionar se sua LAN corresponder precisamente a uma sub-rede de class D.

Talvez seja melhor você olhar para o SAMBA, que pode interrogar os membros da LAN via SMBs, então, pelo menos, você estará usando uma técnica que tem o mesmo significado para a LAN que você faz.