2013-06-25 15 views
3

我需要使用Java从Ubuntu获取计算机IP。我尝试了InetAddress.getLocalHost.getHostAddress().toString();,但它返回127.0.0.1。我正在寻找解决方案,发现此代码:使用Java在UNIX上获取计算机IP的安全方法

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吗?问候。

+1

通过“安全”,你的意思是'可靠'而不是'危险'的相反,对吧? – Gabe

+0

是的。我的意思是适用于所有UNIX系统的方法。如果机器使用除“eth0”之外的其他接口,则我的方法非常危险对于窗口InetAddress.getLocalHost.getHostAddress()。toString()正在工作。 – user2496520

+1

如果计算机在家用无线防火墙/路由器后面使用,该怎么办?这些路由器通常为家中的计算机分配类似192.168.1.x的地址 - 并复用分配给家庭的实际互联网地址。如果允许传入并由防火墙路由,则计算机的地址(192.168.1.101)可能不是可以在互联网上联系计算机的地址(32.78.23.4)。 – Paul

回答

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; 
} 
+0

谢谢。这对我有效。 – user2496520

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

相关问题