如何获得使用Java在同一networking(子网)中连接的IP列表

如何获得使用Java连接到同一子网的设备的IP地址列表?

当networking上的主机响应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"); 

没有testing,但应该像这样工作。 显然这只会检查IP地址的最后一个字节中的254个主机…

检查:

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平function于Java的JDK-15及以上/

希望有所帮助

在局域网上显示活动地址

 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 

要列出连接在局域网中的主机,您需要ping所有可用的子网IP地址。 但是ping消息可能受到防火墙的限制,因此更安全的方法是可以在LAN的IP地址范围内为每个IP地址打开一个套接字。

获取正在响应ping的IP地址列表

我使用Java jdk1.8.0_25为Windows 7 64位制作了这个代码。

第1步:下载nmap的Windows:

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

第2步:确保您可以在命令行或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> 

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

第四步,评估输出

打印出返回的内容。 它是从13.150.23.1到13.150.23.255开始的IP地址的IP地址列表

它有多快?

大约需要4秒钟来扫描255个地址。

由于Java 1.5在java.net.InetAddress中有一个类似于ping的方法:public boolean isReachable(int timeout)。 你可以使用它遍历子网中的所有IP地址… java-doc

如果您的意思是连接到networking的所有主机的列表,我认为唯一可以保证工作的方式是遍历IP地址列表,并将它们全部ping通。

也就是说,如果你正在寻找更具体的东西,你可以查找一些东西(例如RMI的registry( LocateRegistry.getRegistry(host, port).list() )。

另外,如果您只想NetworkInterface.getNetworkInterfaces()定主机的所有IP地址,请查看NetworkInterface.getNetworkInterfaces()

其中一个问题就是TCP / IP中“LAN”和“connected”这两个术语都没有意义。 如果您的LAN正好对应于D类子网,则在D类子网中的所有主机上调用isReachable()的build议技术可能会起作用。

你可能会更好的看SAMBA,它可以通过SMB询问局域网成员,所以至less你会使用一种和局域网相同的技术。