2014-03-03 26 views
3

你好我使用下面的代碼從Java小程序 本地計算機的IP,但我總是得到127.0.0.1,而不是實際IP的如何從Java小程序在本地計算機的IP

public String ip; 
public void init() 
{ 
    try 
    { 
     Enumeration<NetworkInterface> n = NetworkInterface.getNetworkInterfaces(); 
     for (; n.hasMoreElements();) 
     { 
      NetworkInterface e = n.nextElement(); 

      Enumeration<InetAddress> a = e.getInetAddresses(); 
      for (; a.hasMoreElements();) 
      { 
       InetAddress addr = a.nextElement(); 
       ip = "Really " + addr.getHostAddress(); 
       System.out.println(ip); 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
    }  
} 
+2

看看http://stackoverflow.com/questions/1510526/get-the-correct-local-ip-adress-from-java-applet – Batty

+0

*「獲取本地機器ip」*爲什麼? –

+0

其中一個客戶端要求 – user3373819

回答

0

你不能使用未簽名的applet獲取此信息,但您可以授予您的applet相應的策略。有關設置策略文件的一般說明,請首先閱讀this。您需要將其授予。您可能需要簽名。

一旦你得到了照顧,你可以使用NetworkInterface來獲取接口信息。僅檢查活動接口,並跳過回送和鏈接本地地址,例如:

Enumeration<NetworkInterface> ifaces = NetworkInterface.getNetworkInterfaces(); 
while (ifaces.hasMoreElements()) { 
    NetworkInterface iface = ifaces.nextElement(); 
    if (iface.isUp()) { 
     Enumeration<InetAddress> addrs = iface.getInetAddresses(); 
     while (addrs.hasMoreElements()) { 
      InetAddress addr = addrs.nextElement(); 
      if (!addr.isLinkLocalAddress() && !addr.isLoopbackAddress()) 
       System.out.println(addr.getHostAddress()); 
     } 
    } 
} 

請記住,如果存在多個接口,則可能有多個IP。你也會得到IPv4和IPv6地址。

if (!addr.isLinkLocalAddress() && !addr.isLoopbackAddress() && (addr instanceof Inet4Address)) 
    ...; // IPv4 addresses only. 
+0

當我在eclipse中運行你的代碼獲取確切的IP,但是當我運行從HTML頁面的小程序我變空 – user3373819

+1

我編輯你的代碼System.out.println(addr.getHostAddress());現在我得到了ipv4和ipv6地址,我只需要ipv4地址 – user3373819

+0

@ user3373819您可以檢查'addr instanceof Inet4Address'是否是IPv4。請參閱['InetAddress']的繼承關係圖(http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html)。 –

1

試試這個示例:您可以通過檢查,看是否InetAddressInet4AddressInet6Address,如一個實例過濾協議

import java.net.InetAddress; 
... 

ip = InetAddress.getLocalHost(); 
System.out.println("Current IP address : " + ip.getHostAddress()); 

我發現這個解決方案在這裏:How to get Server IP address in Java 和它適用於我的。

+1

如果有IPv6或多個接口不夠用,但是+1,因爲這可能就是所有OP所需要的。 –

+0

@JasonC,謝謝 – AppLend

+1

當我在eclipse中運行你的代碼時,得到了確切的ip,但是當我從html頁面運行applet時,我得到了同樣的結果127.0.0.1 – user3373819

0

可能是您更接受的腳本解決方案嗎?

像這樣:

<script> 
var myip; 
function ip_callback(o) { 
    ip = o.host; 
} 
</script> 
<script src="https://smart-ip.net/geoip-json?callback=ip_callback"></script> 
<script>alert(ip);</script> 

在這種情況下,這個話題將是有益的:Get client IP address via third party web service

+0

我嘗試所有開始創建小程序和activex之前,我得到我的路由器ip – user3373819

0

您可以檢查網絡地址是instanceof Inet4Address。如果它返回true,你可以選擇相同的。

例1

InetAddress ia = InetAddress.getLocalHost(); 
System.out.println("ia.getLocalHost(): " + ia); 
System.out.println("ia.getHostAddress(): " + ia.getHostAddress()); 

// true for 192.168.1.193 or 127.0.0.1 
boolean isIpv4 = (ia instanceof Inet4Address); 

// true for 2001:0:9d38:6abd:186b:38da:3f57:fe3e 
boolean isIpv6 = (ia instanceof Inet6Address); 

getHostAddress()返回127.0.0.1的情況下,你最好與NetworkInterface去識別本地IP地址,從中可以找到IP4地址,如果網絡接口是向上。

實施例2

Enumeration<NetworkInterface> enumNwi = NetworkInterface.getNetworkInterfaces(); 
while(enumNwi.hasMoreElements()) { 
    NetworkInterface nwi = enumNwi.nextElement(); 
    if (nwi.isUp()) { // if the nw is up and running 
     Enumeration<InetAddress> enumInetAddresses = nwi.getInetAddresses(); 
     while (enumInetAddresses.hasMoreElements()) { 
      InetAddress inetAddress = enumInetAddresses.nextElement(); 
      // check if it is not 127.0.0.1 
      if (! inetAddress.isLinkLocalAddress() && 
       ! inetAddress.isLoopbackAddress()) { 
       System.out.println(inetAddress.getHostAddress() + 
            (inetAddress instanceof Inet4Address ? 
             " <<------ IP4 address" : "")); 
      } 
     } 
    } 
} 

參見

+1

相同.. 。,如果我運行eclipse中的代碼,我得到的結果,但是當我從HTML頁面調用時,我變空。我認爲這是安全問題。 applet將不允許獲取實際的IP。 – user3373819

相關問題