3

我需要使用 Java 从 Ubuntu 获取计算机 IP。我试过了,InetAddress.getLocalHost.getHostAddress().toString();但它返回了127.0.0.1。我正在寻找解决方案并发现了这段代码:

NetworkInterface ni = NetworkInterface.getByName("eth0");
    Enumeration<InetAddress> inetAddresses =  ni.getInetAddresses();


    while(inetAddresses.hasMoreElements()) {
        InetAddress ia = inetAddresses.nextElement();
        if(!ia.isLinkLocalAddress()) {
            System.out.println("IP: " + ia.getHostAddress());
        }
    }
}

这段代码对我有用,但问题是当计算机使用“eth1”接口或计算机可以使用无线适配器连接到网络(wlan0)时。在那种情况下,程序将失败。你们能告诉我从 UNIX 系统获取 IP 的安全方法吗?问候。

4

3 回答 3

1

使用枚举getNetworkInterfaces();并循环遍历它们。

                   Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();

                    while (eni.hasMoreElements()) {
                            NetworkInterface ni = eni.nextElement();
                            Enumeration<InetAddress> inetAddresses =  ni.getInetAddresses();


                            while(inetAddresses.hasMoreElements()) {
                                    InetAddress ia = inetAddresses.nextElement();
                                    if(!ia.isLinkLocalAddress()) {
                                            System.out.println("Interface: " + ni.getName() + "   IP: " + ia.getHostAddress());

                                    }
                            }
                    }

在我的 linux 机器上, isLinkLocalAddress() 似乎无法正常工作,因为我得到了 127.0.0.1 但它和 ipv6 版本很容易手动过滤掉。

Interface: wlan0   IP: 192.168.0.8
Interface: lo   IP: 0:0:0:0:0:0:0:1%1
Interface: lo   IP: 127.0.0.1

我的机器只连接在192.168.0.8的无线接口上

于 2013-06-25T08:16:05.243 回答
1

虽然一台计算机可以有多个网络接口和不同的 IP,但某些接口也可能是环回或不运行。为了“安全”,您甚至可能必须检查接口的名称,以查看您是否使用所需的 IP 地址。

以下方法将为您提供来自非环回、启动和运行接口的 IP 地址列表。

 public static List<InetAddress> getIPAddress() throws SocketException {

    List<InetAddress> ipAddresses = new ArrayList<InetAddress>();
    Enumeration e;
    e = NetworkInterface.getNetworkInterfaces();
    while (e.hasMoreElements()) {
        NetworkInterface ni = (NetworkInterface) e.nextElement();
        if (ni.isLoopback() || !ni.isUp()) continue;

        for (Enumeration e2 = ni.getInetAddresses(); e2.hasMoreElements(); ) {
            InetAddress ip = (InetAddress) e2.nextElement();
            ipAddresses.add(ip);
        }
    }
    return ipAddresses;
}
于 2013-06-25T08:31:57.600 回答
0

查看此 SO 问题的答案:

如何从 Java 枚举所有启用的 NIC 卡的 IP 地址?

我还没有测试它,但它似乎适用。

于 2013-06-25T08:12:09.830 回答