- 浏览: 229174 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (86)
- Java_基础 (6)
- ubuntu (15)
- 数据结构 (1)
- linux_c (9)
- linux_基础 (5)
- linux_文件I/O (0)
- linux_进程与线程 (0)
- linux_网络编程 (0)
- linux_GUI编程 (0)
- linux_数据库 (0)
- JavaMail (1)
- android_基础 (31)
- android_UI (4)
- android_Graphics (2)
- android_性能 (0)
- android_线程机制 (0)
- android_设计模式 (0)
- android_framework (0)
- android_移植 (0)
- 学习方法 (6)
- 转载 (26)
- 翻译 (0)
- 读书笔记 (10)
- MFC (13)
- C++ (17)
- Oracle (2)
- Objective-C (0)
- IOS (0)
最新评论
-
darkjune:
不错的文章
android/java设置DNS缓存 -
lz_cleaner:
对我太有用了,万分感谢,写的这么详细。
斜率计算:反正切函数 Math.atan() 与 Math.atan2() 的区别 -
Wesley.S:
兄弟,能告诉我 Security 的属性名在哪里查找吗??
android/java设置DNS缓存 -
panhe1992:
请问这个方法安装的ubuntu要如何删除,删除的时候貌似mbr ...
win7下(有隐藏分区)硬盘安装ubuntu
在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作。在Java中为了缓解这个问题,提供了DNS缓存。当InetAddress类第一次使用某个域名(如www.google.com)创建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,否则如果一个域名因为暂时的故障而无法访问,那么程序再次访问这个域名时,即使这个域名恢复正常,程序也无法再访问这个域名了。除非重新运行程序。
发表评论
-
mac 下 android studio 识别不出真机
2016-10-25 19:10 1525$ system_profiler SPUSBDataTyp ... -
Android:INSTALL_FAILED_UPDATE_INCOMPATIBLE 错误解决方法
2013-04-22 17:20 1775晚上在测一个widget,前面测的好好的,后面再安装的时候发 ... -
android:WebView使用
2012-10-30 22:55 15779如何创建WebView: 1、添加权限:Androi ... -
Java: enum学习
2012-09-18 14:28 887在像C这样强调数据结构的语言里,枚举是必不可少的一种数据类型。 ... -
android:string.xml文件中的整型和string型代替
2012-09-18 12:16 990在android的开发中 ... -
android:自定义长按/长点击事件
2012-08-29 14:14 8841自定义的长按事件。 public class LongP ... -
android:ListView中放置Button导致点击失效
2012-08-13 23:58 2456ListView 和其它能触发点击事件的widg ... -
android:计算画布中两点的距离
2012-10-30 23:29 2380计算画布中两点的距离 float fLen = (float ... -
android:PopupWindow的使用
2012-07-31 10:51 8653项目中要用到PopupWindow。查了一下用法, ... -
android:实现双击事件(DoubleClick)
2012-07-31 10:32 11526自己实现的双击事件,以Button为例说明。 publi ... -
Android工程名出现红色感叹号
2012-07-09 16:16 1329如果一个android项目引用过第三方库 ... -
matrix使用:平移
2012-06-21 13:19 2011android绘图中使用的矩阵 ... -
ListView拖动时背景变黑的问题
2012-06-20 17:28 923操作ListView的时候,直接用触摸拖动视图 ... -
android:Button添加图片
2012-06-20 15:52 5543在button上添加图片: <Button ... -
android:本地图片转换为位图
2012-06-20 15:09 1601/** * 将本地图片转换为位图 ... -
android使用尺寸资源
2012-06-17 12:00 23391.在values文件夹下建立名为dimens.xml的文件 ... -
eclipse中统计代码行数
2012-06-05 12:14 905在eclipse中, 打开File Search对话框, ... -
设置 Eclipse 智能提示,大幅度减少 alt+/ 使用频率
2012-06-05 10:06 1012以往 我们往往在输入 ... -
斜率计算:反正切函数 Math.atan() 与 Math.atan2() 的区别
2012-06-04 21:05 16107我们可以使用正切操作 ... -
Drawable, Bitmap和byte[]的转换
2012-06-17 12:00 858android在处理一写图片资源的时候,会进行一些类型的转换 ...
相关推荐
这款应用基于Java语言开发,利用了Android系统的特性,使得普通用户也能轻松管理自己的DNS设置。 **DNS基础** DNS(Domain Name System)是互联网的一项关键服务,它将人类可读的域名(如www.example.com)转换成...
jmdns(Java Multicast DNS)是一个用于Java和Android的轻量级DNS服务发现库,它实现了Bonjour/ZeroConf协议,允许设备在没有中央服务器的情况下发现彼此。Bonjour是由Apple公司推出的一种网络服务发现协议,它利用...
在Android和Java的面试中,掌握关键知识点是至关重要的。以下是一些基于给定内容的详细解释: **Android基础知识与底层机制** 1. **数据库操作**:Android中主要使用SQLite数据库,操作包括创建、查询、更新、删除...
4. **应用DNS解析结果**: 结果可用于各种用途,如监控DNS流量、分析DNS缓存行为、检测DNS劫持等。 在提供的`pcap4jDemo`文件中,可能包含了实现上述功能的示例代码。通过阅读和理解这个示例,你可以更好地掌握Pcap4...
然而,需要注意的是,由于DNS(域名系统)可能存在缓存,当我们尝试解析一个域名时,可能会得到旧的IP地址。为了确保获取最新的IP,我们可以设置`InetAddress`的查询超时时间。下面是如何设置超时的代码片段: ```...
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
相较于传统的DNS解析,HttpDNS可以绕过Local DNS缓存污染,避免中间环节的干扰,提供更安全、快速的网络访问。 接入HttpDNS Android SDK的版本为3.1.0,开发者需要在项目中集成该SDK以实现功能。集成步骤包括以下几...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
- DNS解析流程:从本地缓存、hosts文件到DNS服务器的查询过程。 **第二节 操作系统面试题** - 进程与线程的区别:进程是资源分配的最小单位,线程是执行的最小单位。 - 内存管理:了解虚拟内存、页表、内存分配策略...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...
SimpleCache 是一个简单易用的java缓存工具,用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持,对业务代码零侵入 2. 支持使用Redis和Memcached作为后端缓存。3. 支持缓存数据分区规则的...