日期:2014-05-20  浏览次数:20772 次

使用java中InetAddress类进行反向DNS查找出现问题?
我遇到一个和这博客里面描述一模一样的问题:http://blog.donews.com/maverick/archive/2005/07/26/482512.aspx


晚上看Programming Spiders Bots and Aggregators in Java,第一章就碰到问题。

通过Hostname检索IP倒是很容易:
InetAddress address = InetAddress.getByName("www.donews.com");
System.out.println(address);
就可以获得该HostName对应的IP地址
上面这段代码的输出结果是:
www.donews.com/61.135.128.150

如果不使用getByName方法,而是使用
getAllByName(String hostname)方法,就能够获得该Hostname对应的所有IP地址,返回的是InetAddress数组,我用www.sina.com.cn作参数,获得了16个地址:
www.sina.com.cn/202.106.185.243
www.sina.com.cn/202.106.185.244
www.sina.com.cn/202.106.185.248
www.sina.com.cn/61.135.153.177
www.sina.com.cn/61.135.153.178
www.sina.com.cn/61.135.153.179
www.sina.com.cn/61.135.153.180
www.sina.com.cn/61.135.153.181
www.sina.com.cn/61.135.153.182
www.sina.com.cn/61.135.153.183
www.sina.com.cn/61.135.153.184
www.sina.com.cn/202.106.185.237
www.sina.com.cn/202.106.185.238
www.sina.com.cn/202.106.185.239
www.sina.com.cn/202.106.185.241
www.sina.com.cn/202.106.185.242
www.sina.com.cn/202.106.185.243

按照书里的介绍,不需要更改上面的代码,只要把getByName的参数换成ip地址,就可以反向查找Hostname(reverse DNS),但是我测试不通过。
上网查了查,必须调用getHostName()或者getCanonicalHostName()方法,才能获得HostName。例如:
InetAddress address2 = InetAddress.getByName("64.236.16.84");
System.out.println(address2);
System.out.println(address2.getHostName());
System.out.println(address2.getCanonicalHostName());
输出是:
/64.236.16.84 <–此处的InetAddress方法显示与上面不同
www6.cnn.com
www6.cnn.com

奇怪的是,对于某些IP,却不能测试成功
例如,对于Donews的IP 61.135.128.150,运行上面的代码
输出的结果如下:
/61.135.128.150
61.135.128.150
61.135.128.150

我在Sun的网站上查到关于这个问题的讨论,看到最后的解决方案是
在InetAddress构造之前,添加这样一条语句:
System.setProperty("sun.net.spi.nameservice.provider.1", "dns,sun");
可是,在我的机器上测试无效

神奇,不知道什么时候能找到解决方案。

------解决方案--------------------
分数不要浪费了