Java网络编程:DNS缓存
Java络络络络网程:DNS络存
在通过DNS过过过过过过过过过过过过过过找域名的程中,可能会多台中DNS过过过过过过过过服器才能找到指定的域名,因此,在DNS过过过过过过过过过过过过过过过过过服器上找域名是非常昂的操作。在Java过过过过过中了解个,提供了过过过过过过DNS过存。当InetAddress过第一次使用某个域名,如www.csdn.net,过建InetAddress过象后,JVM过过过过过过过就会将个域名和它从DNS过过过过过过过上得的信息,如IP地址,都保存在DNS过存中。当下一次InetAddress过过过过过过过过过过过再使用个域名,就直接从DNS过存里得所需的信息,而无需再过过过过过过过过过过过过过过DNS过过过服器。
DNS过过过过过过过过过过过过过过过过过过过过过过过存在默将永保留曾的域名信息,但我可
以修改个默。一般有两方法可以修改个默:过过过过过过过过过过过过过过过过过过过过过过过
1. 过在程序中通java.security.Security.setProperty过过过过过过方法置安全属性networkaddress.cache.ttl过过过过过过过过过过过过过过过过过过过过过的,位:秒,。如下面的代将存超10秒:java.security.Security.setProperty("networkaddress.cache.ttl", 10);
2. 设置java.security文件中的networkaddress.cache.negative.ttl属性。假设JDK的安装目设是C,\jdk1.6~那设java.security文件位于c,\jdk1.6\jre\lib\security目设中。打设设文个件~到找networkaddress.cache.ttl属并将个属性~设设设性设设设相设的设存超设;设位,秒,。
如果将networkaddress.cache.ttl属性设设设-1~那设DNS设存据永设不设放。下面数将会
的代设演示了使用和不使用DNS设存所设生效果,
package mynet;
import java.net.*;
public class MyDNS
{
public static void main(String[] args) throws Exception
{
// args[0]: 本机名 args[1],设设设冲
if (args.length < 2)
return;
java.security.Security.setProperty("networkaddress.cache.ttl", args[1]);
long time = System.currentTimeMillis();
InetAddress addresses1[] = InetAddress.getAllByName(args[0]);
System.out.println("addresses1: "
+ String.valueOf(System.currentTimeMillis() - time)
+ "毫秒");
for (InetAddress address : addresses1)
System.out.println(address);
System.out.print("按任意设设设");
System.in.read();
time = System.currentTimeMillis();
InetAddress addresses2[] = InetAddress.getAllByName(args[0]);
System.out.println("addresses2: "
+ String.valueOf(System.currentTimeMillis() - time)
+ "毫秒");
for (InetAddress address : addresses2)
System.out.println(address);
}
}
在上面的代设中设置了DNS设存超设;通设args[1]参数参数将,~用设可以通设命令行设个设设入MyDNS中。设程序首先使用个getAllByName建立一个InetAddress数设~然后通设System.in.read使程序设停。用设等待一段设设后~可以按任意设设设~使用同一域名当并个
;args[0],再建立一个InetAddress数设。如果用设等待的设段设设比DNS设存超设小~那设无设情如何设化~况addresses2和addresses1数并设中的元素是一设的~且设建addresses2数设所花设的设设一般设0毫秒;小于1毫秒后~Java无法设得更精的设设,。确
设设1,
设行如下命令;将DNS设存超设设设5秒,,
java mynet.MyDNS www.126.com 5
行设果运1;在5秒之按任意设,,内
addresses1: 344毫秒
www.126.com/202.108.9.77
按任意设设设
addresses2: 0毫秒
www.126.com/202.108.9.77
行设果运2;在5秒后按任意设,,
addresses1: 344毫秒
www.126.com/202.108.9.77
按任意设设设
addresses2: 484毫秒
www.126.com/202.108.9.77
在上面的设设中可能出设行设果。如果在出设“按任意设设设…”后~在两个运5秒之按内任意设设设后~就得到行设果会运1~设设设果可以看出~从个addresses2所用的设设设0毫秒~也就是设~addresses2并真未正设设DNS服设器~而是直接存中的从内DNS设存得到的数据。在当5秒后按任意设设设后~就得到行设果会运2~设设~存中的内DNS设存中的据已设设数放~所以addresses2设得再设设DNS服设器~因此~addresses2的设设是484毫秒;addresses1和addresses2后面的毫秒可能在不同的设境下的设不一设~但一般情下数况~运行设果1的addresses2的设设0或是一接近个0的~如数5.运行设果2的addresses2的设一般和会addresses1的设接近~或是一设比很个0大的~如数1200,。
设设2,
设行如下命令;ComputerName设本机的设算机名~DNS设存超设设设永不设期[-1],,java mynet.MyDNS ComputerName -1
行设果;按任意设设设之前~运将192.168.18.20设除,,
addresses1: 31毫秒
myuniverse/192.168.18.10
myuniverse/192.168.18.20
按任意设设设
addresses2: 0毫秒
myuniverse/192.168.18.10
myuniverse/192.168.18.20
上面的设设可以看出~从将DNS设存设设永不设期后~无设设多少设设~按任意设后~addresses2任然得到了两个IP地址;192.168.18.10和192.168.18.20,~而且addresses2的设设是0毫秒~但在设设192.168.18.20已设被设除。因此可以判断~addresses2是从DNS设存中得到的据。如果行如下的命令~在数运并5秒后按任意设设设后~addresses2就只剩下一会个IP地址;192.168.18.10,。
java mynet.MyDNS ComputerName 5
如果域名在DNS服设器上不存在~那设客设端在设行一段设设的设设后;平均设5秒,~就会个抛出一UnknownHostException异个常。设了设下一次设设设域名设不再等待~DNS设存将个来设设设信息也保存了起设。也就是设~只有第一次设设设设域名设才设行5称左右的设设~以后再设设设域名设直接抛出个将UnknownHostException异常~而无需再等待5秒设~设设域名失设的原因可能是设域名的不存在~也可能是因设个真DNS服设器或是其他的硬件或设件的设设故障~因此~一般不能设设域名设设信息一直保留。在将个Java中可以通设networkaddress.cache.negative.ttl属个属性设置保留设些信息的设设。设性的默设设是10秒。它也可以通设java.security.Security.setProperty方法或java.security文件设置。下面的来代设演示了networkaddress.cache.negative.ttl属性的用法,
package mynet;
import java.net.*;
public class MyDNS1
{
public static void main(String[] args) throws Exception
{
java.security.Security.setProperty("networkaddress.cache.negative.ttl",
"5");
long time = 0;
try
{
time = System.currentTimeMillis();
InetAddress.getByName("www.ppp123.com");
}
catch (Exception e)
{
System.out.println("www.ppp123.com不存在! address1: "
+ String.valueOf(System.currentTimeMillis() - time)
+ "毫秒");
}
//Thread.sleep(6000); // 延设6秒
try
{
time = System.currentTimeMillis();
InetAddress.getByName("www.ppp123.com");
}
catch (Exception e)
{
System.out.println("www.ppp123.com不存在! address2: "
+ String.valueOf(System.currentTimeMillis() - time)
+ "毫秒");
}
}
}
在上面的代设中将networkaddress.cache.negative.ttl属性设设设5秒。设程序分设设设了个address1和address2设设www.ppp123.com;设是不存在的域名~设者可以其设成任何个将
不存在的域名,后~用了多设设设抛出UnknownHostException异常。
行设果,运
www.ppp123.com不存在, address1: 4688毫秒
www.ppp123.com不存在, address2: 0毫秒
我设上面的行设果可以看出~从运address2使用了0毫秒就抛出了常~因此~可以异
断定address2是从DNS设存里设得了域名www.ppp123.com不可设设的信息~所以就直接抛出了UnknowHostException异将常。如果上面代设中的延设代设的注设去掉~那设可能得到如下的行设果,运
www.ppp123.com不存在, address1: 4688毫秒
www.ppp123.com不存在, address1: 4420毫秒
上面的行设果可以看出~在第从运6秒设~DNS设存中的据已设被设放~因此数~address2仍需要设设DNS服设器才能知道www.ppp123.com是不可设设的域名。
在使用DNS设存设有点需要注意,两
1. 可以根据设设情设置况来networkaddress.cache.ttl属将个属性的设。一般设设设性的设设设-1.但如果设设的是设设映射的域名;如使用设设域名服设域名映射成将ADSL的设设IP,~ 就可能设生IP地址设化后~客设端得到的设是原的来IP地址的情。况
2. 在设置networkaddress.cache.negative.ttl属将它性设设最好不要设设-1~否设如果一域个名因设设设的故障而无法设设~那设程序再次设设设域名设~使设域名恢设正常~程序也无法个即个
再设设设域名了。除非重新行程序。个运