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