2013-06-25 16 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

相關問題