使用Java在UNIX上获取计算机IP的安全方法

时间:2013-06-25 08:02:35

标签: java unix inetaddress

我需要使用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吗?问候。

3 个答案:

答案 0 :(得分: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的无线接口上连接

答案 1 :(得分: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;
}

答案 2 :(得分:0)

查看此SO问题的答案:

How to enumerate IP addresses of all enabled NIC cards from Java?

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