2009-10-02 40 views
9

正確的本地IP地址我想從我的Java小程序確定本地IP地址。問題是當同一臺機器上有幾個IP地址時,它具有局域網和互聯網連接 (palm,VMWare ...)。獲得從Java小程序

這裏是我的測試:

public static void main(String[] args) { 
     try { 
     String hostName = InetAddress.getLocalHost().getHostName(); 
     System.out.println("HostName = " + hostName); 
     System.out.println("HostAddressLocal = " + 
      InetAddress.getLocalHost().getHostAddress()); 
     InetAddress[] inetAddresses = InetAddress.getAllByName(hostName); 
     for (InetAddress inetAddress : inetAddresses) { 
      System.out.println("hostAddress = " + inetAddress.getHostAddress()); 
     } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

結果是:

HostName = xxxx 
    HostAddressLocal = xx.xx.xx.xx 
    hostAddress = 10.10.11.51 
    hostAddress = 192.168.23.1 
    hostAddress = 192.168.106.1 

其中XX.XX.XX.XX是不正確的地址。正確的是10.10.11.51。


編輯迴應jarnbjo

你的水晶球說的是事實。你瞭解我的問題。客戶端可以通過代理連接,所以我不能使用你的第一點。如果我在我的電腦上執行下面這段代碼:

Socket s = new Socket("www.w3c.org", 80); 
    InetAddress ip = s.getLocalAddress(); 
    System.out.println("Internet IP = " + ip.toString()); 
    s.close(); 

我有這樣的結果:

Internet IP = /127.0.0.1 

而且不10.10.11.51

+0

你的意思是小程序嗎?主要和能夠訪問本地UP地址? –

+0

我們也有這個問題。 – KLE

+3

你到底在做什麼?你爲什麼需要這些信息?如果用戶沒有本地地址會怎麼樣?如果用戶有很多接口和許多本地地址會怎麼樣?如果用戶擁有IPv6(每個接口可能有多個地址)會怎麼樣?你的程序有一些設計問題,它不應該依賴這個特性來正確工作。 – Juliano

回答

-1

在的gethostname的底部()C函數的gethostbyname()。他們最初期待/ etc/hosts,然後嘗試通過DNS解析。所以,如果你添加10.10.11.51 MYHOSTNAME到/ etc/hosts中的gethostname()應該正確 檢測到它在Windows,有一個模擬到/ etc/hosts文件,AFAIR在\ WINDOWS \ SYSTEM32 \ Servises左右...

這是唯一的名稱解析問題。

在您的代碼中,您首先獲取主機名(hostName = InetAddress.getLocalHost()。getHostName();) 此函數返回安裝系統時安裝的計算機名稱。 然後你得到具體的主機名的所有IP(InetAddress.getAllByName(主機名)) - 填報的IP解決了該主機名稱

簡單的例子

1/etc/hosts中這樣

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 

你的代碼返回

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 

2改變/ etc/hosts文件看起來像

 
127.0.0.1 localhost 
127.0.1.1 fred-desktop 
192.168.1.1 fred-desktop 
20.20.20.20 fred-desktop 

你的代碼將返回

 
HostName = fred-desktop 
HostAddressLocal = 127.0.1.1 
hostAddress = 127.0.1.1 
hostAddress = 192.168.1.1 
hostAddress = 20.20.20.20 

弗雷德 - 桌面 - 我的Ubuntu箱的名稱。

+0

這不是問題。問題不在於名稱解析,而在於可能存在多個接口。 – sleske

+0

非常糟糕的投票下來甚至不注意回答... –

+0

問題是爲Java和你給一個不同的目的C調用 – Mark

11

正如你已經發現的那樣,一臺計算機可能有很多具有不同IP地址的網絡接口,並且猜測你認爲哪一個是「正確的」,因爲它們都是正確的,這有點困難。

我的水晶球建議我說,你的意思是IP地址,客戶端使用連接到服務器,從該小程序被加載。如果是這樣,你至少有兩種可能性:

  • 在服務器上,你可以嵌入一個動態生成HTML頁面上的小程序,並添加客戶端的IP地址作爲一個applet參數。至少如果你沒有通過代理進行HTTP操作,Web服務器應該能夠確定客戶端的IP地址並將它傳遞給小程序。

  • 在小程序,可以打開一個TCP套接字從中加載applet的Web服務器,並檢查其本地地址被用於連接:

Socket s = new Socket("www", 80); 
InetAddress ip = s.getLocalAddress(); 
s.close(); 
+0

非常感謝!看到我的編輯問題。 – EFalco

+0

這一般不會在一個小程序,這些天工作,由於在默認的沙盒模式缺乏安全權限。您必須授予該applet的[政策文件applet的[java.net.NetPermission.getNetworkInformation(http://docs.oracle.com/javase/7/docs/api/java/net/NetPermission.html) ](http://docs.oracle.com/javase/tutorial/security/tour1/step2.html)。 –

+0

創造了「www」的插座停止工作,請參閱我的問題:http://stackoverflow.com/questions/28487579/jsp-new-socket-www-80-stopped-working-after-years-of-working-好 –