代码之家  ›  专栏  ›  技术社区  ›  Jigar Joshi

如何使用Java获取同一网络(子网)中的IP连接列表

  •  38
  • Jigar Joshi  · 技术社区  · 14 年前

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

    8 回复  |  直到 6 年前
        1
  •  46
  •   h0ussni genericuser    10 年前

    当网络上的主机对ICMP包(Ping)作出反应时,这应该可以工作(gt;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");
    

    没有测试它,但应该像这样工作。显然,这只检查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-ping-in-java-jdk-15-and-above/

    希望有帮助

        2
  •  6
  •   Eric Leschinski Mr. Napik    10 年前

    获取响应ping的IP地址列表

    我用Java JDK1.80Y25制作了Windows 7 64位的代码。

    步骤1:下载NMAP for 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;
    }
    

    步骤4,评估输出

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

    有多快?

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

        3
  •  5
  •   Suhas Phartale    14 年前

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

        4
  •  3
  •   Thusitha Wickramasinghe    9 年前

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

    产量

    127.0.0.1
    0:0:0:0:0:0:0:1
    172.128.1.102
    
        5
  •  1
  •   Scott    14 年前

    如果您指的是连接到网络的所有主机的列表,我认为保证工作的唯一方法是单步执行一个IP地址列表,并对所有IP地址执行ping操作。

    也就是说,如果你想找更具体的东西,你可以查到一些东西(例如RMI的注册表( LocateRegistry.getRegistry(host, port).list() )

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

        6
  •  1
  •   vicatcu    14 年前

    由于Java 1.5在Java.NET.InAdvess中有类似ping的方法: public boolean isreachable(int timeout)。您可以使用它迭代子网中的所有IP地址… java-doc

        7
  •  0
  •   Sumukha Pk    6 年前

    这些都不适用于我,因为我创建了服务器,它没有响应这些ping。因此,我创建了一种机制,使服务器对ping作出响应,并对子网中的所有地址使用暴力检查方法。

    PS:写这个是因为创建自己的服务器的人可能需要这个。

        8
  •  -1
  •   user207421    14 年前

    这里的一个问题是,术语“LAN”和“Connected”在TCP/IP中都没有意义。如果您的局域网精确对应于D类子网,那么在D类子网中的所有主机上调用isreachable()的建议技术可能会起作用。

    你最好看一下Samba,它可以通过smbs询问局域网成员,所以至少你会使用一种对局域网有同样意义的技术。