2011-09-12 51 views
2

用下面的代碼InetAddress.getLocalHost()。getHostAddress();涉及DNS服務器?

InetAddress.getLocalHost().getHostAddress(); 

有可能獲得主機的地址。但是JVM如何發現它?

Java API只會告訴你它返回它(API Reference),但是是否存在涉及的DNS服務器,如果是,它何時被調用?

如果只調用一次服務器名稱如何在本地保存?

+0

順便說一句,依靠你的主機只有一個地址是有點危險。大多數系統有例如一個自動配置的具有多個地址的IPv6堆棧。 – jarnbjo

回答

6

實際執行與JNI完成後,在本機代碼,因此它會從不同的平臺之間。

也就是說,沒有任何理由需要做的DNS到網卡所在的計算機上搜索的IP地址。人們可以從網卡上讀取IP信息。

壞消息:如果在任何運行Java的平臺上執行DNS查找,因爲它是本機代碼以及機器執行DNS查找的可能性實際上並不存在。

好消息是:在我的Linux中,它不會做DNS查找(通過Wireshark的證實),這正是我所期望的。如果您認爲它正在進行查找,可能會進行查找的原因有很多(取決於本機綁定客戶端的可配置性),並且如果您安裝wireshark(或使用合適的網絡分析器),則可以快速查找如果你正在查找自己。

編輯:請注意,名稱查找將位於鏈接調用的.getLocalHost()部分,如果要查找它的話。

+0

爲什麼你認爲它是一種本地方法是相關的?即使該方法是用Java實現的,除非在API文檔中指定,否則不能依賴特定的行爲。 – jarnbjo

+0

本地方法有沒有單一的具體實施,而不是有每個平臺的實現。這意味着要知道代碼將永遠不會執行DNS查找,因此需要知道沒有人編寫(或將寫入)最終支持DNS查找的實現。這是不可能的,而Java的行爲是在調用就是提供清晰的,但它不是它將如何做清晰。有些人可能會在實際需要之前選擇DNS解決方案的平臺上實施它。 –

+0

標準Java API中沒有任何方法只有一個特定的實現。如果這個方法是本地的,或者如果它是用Java實現的,這是無關緊要的。 – jarnbjo

0

InetAddress(尤其是InetAddress.getLocalHost()的結果)表示IP地址,並且getHostAddress()返回其文本表示,因此它不需要DNS查找。

如果你需要一個主機名,你可以調用getHostName() - 它可以執行反向DNS查找:

如果InetAddress地址與主機名創建的,該主機名會被記住並返回;否則,將執行反向名稱查找,並根據系統配置的名稱查找服務返回結果。如果需要查找名稱服務,請調用getCanonicalHostName。

0

InetAddress.getLocalHost()不做大多數人認爲它所做的事情。它實際上會返回機器的主機名以及與該主機名關聯的IP地址。這可能是用於連接到外部世界的地址。它可能不會。這取決於你如何配置你的系統。

在我的windowsbox上它獲取機器名稱和外部IP地址。在我的Linux操作系統中,因爲我有它在/ etc/hosts中

沒有用這裏涉及DNS服務器的設置,以便返回主機名和127.0.0.1。