浅尝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

相关文章
相关标签/搜索