淺嘗java.net.InetAdrress

InetAdrress是java.net包中提供的一個網絡地址類,之因此會寫這個,主要是看域名解析的內容,看到java InetAdrress會緩存DNS返回的結果。html

好比寫下面一小段代碼,用於獲取主機名和IP地址。 該方法會創建與本地DNS的一個鏈接,來獲取名稱和地址之間的映射關係。(若是本地DNS緩存了地址,就再也不獲取鏈接。)java

InetAddress addr = InetAddress.getByName("www.baidu.com");

System.out.println( addr.getHostName());  //得到主機名
System.out.println( addr.getHostAddress());   //得到IP地址

獲取InetAdrress實例的方法api

1. 用 getLocalHost() 方法建立的InetAddress的對象  本機
2. 用域名建立 InetAddress對象
   用域名做爲getByName和getAllByName方法的參數獲得的InetAddress對象,該對象會獲得這個域名,當調用
   getHostName時,就無需再訪問DNS服務器,而是直接將這個域名返回。
3. 用IP地址 建立InetAddress對象
   使用IP地址建立InetAddress對象(getByName,getAllByName,getByAddress方法均可以經過IP地址
   建立InetAddress對象)時,並不須要訪問DNS服務器。所以經過DNS服務器查找域名的工做就由getHostName方法來完成。
   若是IP地址不存在或DNS服務器不容許進行IP地址和域名映射,就返回這個IP地址。
因爲DNS查找的開銷很大,而且若是一個地址不可達,可能會須要幾秒鐘的時間來確認。
InetAddress提供了緩存機制,一旦獲得一個給定主機的地址,就會緩存起來,
即便從新定義一個InetAddress類,也不會從新再獲取一次,而是直接從緩存中獲取。

前輩說能夠直接修改java security文件,或者修改啓動參數 Dsun.net.inetaddr.ttl= xxx,或者動態修改InetAdrress中的值,但我沒有嘗試。緩存

而後咱們看看getByName的方法執行:服務器

private static InetAddress[] getAllByName(String host, InetAddress reqAddr)

先對Host的值作個判斷,爲空就是本機網絡

而後這個方法基本上都仍是數據的校驗,這也不是我要看的點oracle

上個方法最後調用的是下面這個,最後一個參數 useCache 用了true.net

private static InetAddress[] getAllByName0(String host,
                                           InetAddress reqAddr,
                                           boolean check,
                                           boolean useCache)

先從緩存中查找,useCache爲false竟然還從緩存中刪除。若是找不到緩存中的域名解析,那麼就會執行NameServiceAddresses中的get方法,訪問DNS服務htm

 

參考:對象

https://docs.oracle.com/javase/8/docs/api/index.html

http://blog.csdn.net/qq_27603235/article/details/53725653

http://zzqrj.iteye.com/blog/544784

相關文章
相關標籤/搜索