- 浏览: 224306 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1442$ system_profiler SPUSBDataTyp ... -
Android:INSTALL_FAILED_UPDATE_INCOMPATIBLE 错误解决方法
2013-04-22 17:20 1713晚上在测一个widget,前面测的好好的,后面再安装的时候发 ... -
android:WebView使用
2012-10-30 22:55 15690如何创建WebView: 1、添加权限:Androi ... -
Java: enum学习
2012-09-18 14:28 857在像C这样强调数据结构的语言里,枚举是必不可少的一种数据类型。 ... -
android:string.xml文件中的整型和string型代替
2012-09-18 12:16 946在android的开发中 ... -
android:自定义长按/长点击事件
2012-08-29 14:14 8780自定义的长按事件。 public class LongP ... -
android:ListView中放置Button导致点击失效
2012-08-13 23:58 2402ListView 和其它能触发点击事件的widg ... -
android:计算画布中两点的距离
2012-10-30 23:29 2341计算画布中两点的距离 float fLen = (float ... -
android:PopupWindow的使用
2012-07-31 10:51 8607项目中要用到PopupWindow。查了一下用法, ... -
android:实现双击事件(DoubleClick)
2012-07-31 10:32 11426自己实现的双击事件,以Button为例说明。 publi ... -
Android工程名出现红色感叹号
2012-07-09 16:16 1276如果一个android项目引用过第三方库 ... -
matrix使用:平移
2012-06-21 13:19 1968android绘图中使用的矩阵 ... -
ListView拖动时背景变黑的问题
2012-06-20 17:28 879操作ListView的时候,直接用触摸拖动视图 ... -
android:Button添加图片
2012-06-20 15:52 5508在button上添加图片: <Button ... -
android:本地图片转换为位图
2012-06-20 15:09 1567/** * 将本地图片转换为位图 ... -
android使用尺寸资源
2012-06-17 12:00 23041.在values文件夹下建立名为dimens.xml的文件 ... -
eclipse中统计代码行数
2012-06-05 12:14 866在eclipse中, 打开File Search对话框, ... -
设置 Eclipse 智能提示,大幅度减少 alt+/ 使用频率
2012-06-05 10:06 970以往 我们往往在输入 ... -
斜率计算:反正切函数 Math.atan() 与 Math.atan2() 的区别
2012-06-04 21:05 15800我们可以使用正切操作 ... -
Drawable, Bitmap和byte[]的转换
2012-06-17 12:00 817android在处理一写图片资源的时候,会进行一些类型的转换 ...
相关推荐
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
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. 支持缓存数据分区规则的...
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. 支持缓存数据分区规则的...
1、MaginotDNS攻击:绕过DNS 缓存防御的马奇诺防线 2、从形式逻辑计算到神经计算:针对LLM角色扮演攻击的威胁分析以及防御实践 3、TheDog、0xEas-JDoop:下一代针对Java Web应用的静态分析框架 4、轻舟“难”过...
一个非常棒的多平台(lin、win、mac、android)本地缓存和代理 dns 服务器! - 用于 Brotli 压缩的 NGINX 模块 - PHP 扩展 - Memcache 模块,支持较新的 PHP 7.0-7.3 - Pi-hole FTL引擎 - 精选的 Nginx 发行版、第 3...
VKEncode音乐 该程序使您可以将ENCODED文件从VK缓存转码为MP3,以便在第三方播放器中收听它们。 根据最近发生的事件,在旧版本的客户端中,您将无法再听音乐或将其保存。 在这方面,应用程序的相关性仅适用于使用...