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