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

使用Java在UNIX上获取计算机IP的安全方法,java,unix,inetaddress,Java,Unix,Inetaddress,我需要使用Java从Ubuntu获取计算机IP。我尝试了InetAddress.getLocalHost.getHostAddress().toString()但它返回127.0.0.1。我正在搜索解决方案,发现以下代码: NetworkInterface ni = NetworkInterface.getByName("eth0"); Enumeration<InetAddress> inetAddresses = ni.getInetAddresses();

我需要使用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());
        }
    }
}
NetworkInterface ni=NetworkInterface.getByName(“eth0”);
枚举inetAddresses=ni.getInetAddresses();
while(inetAddresses.hasMoreElements()){
InetAddress ia=inetAddresses.nextElement();
如果(!ia.isLinkLocalAddress()){
System.out.println(“IP:+ia.getHostAddress());
}
}
}

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

查看此问题的答案:


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

使用枚举
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());

                                    }
                            }
                    }

我的机器仅通过192.168.0.8上的无线接口连接

虽然一台计算机可以有多个网络接口和不同的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;
}
publicstaticlist getIPAddress()抛出SocketException{
List ipaddress=new ArrayList();
e;
e=网络接口。getNetworkInterfaces();
而(e.hasMoreElements()){
NetworkInterface ni=(NetworkInterface)e.nextElement();
如果(ni.isLoopback()| |!ni.isUp())继续;
对于(枚举e2=ni.getInetAddresses();e2.hasMoreElements();){
InetAddress ip=(InetAddress)e2.nextElement();
ip地址。添加(ip);
}
}
返回IP地址;
}

所谓“安全”是指“可靠”而不是“危险”的对立面,对吗?是的。我指的是在所有UNIX系统上都有效的方法。如果计算机对Windows InetAddress使用除“eth0”以外的其他接口,则我的方法是危险的。getLocalHost.getHostAddress().toString()正在工作。如果计算机在家庭无线防火墙/路由器后面使用,该怎么办?这些路由器通常会将192.168.1.x之类的地址分配给家庭中的计算机,并多路传输分配给家庭的实际互联网地址。如果防火墙允许并路由传入,则计算机的地址(192.168.1.101)可能不是可以在internet(32.78.23.4)上与计算机联系的地址。除了计算机可以使用多个网络接口,每个网络接口可以分配多个ip地址之外,还有一个问题,如果您想要本地地址(例如,决定服务器进程应该绑定到哪个地址)或公共internet地址(以便知道对等方应该连接到哪个地址)。某些计算机不会知道其外部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;
}