黑马程序员技术交流社区

标题: InetAddress获取网络上的主机名 [打印本页]

作者: 李政    时间: 2013-7-23 12:05
标题: InetAddress获取网络上的主机名
本帖最后由 杨兴庭 于 2013-7-23 21:10 编辑

import java.net.*;
class baiduDemo
{
        public static void main(String[] args) throws UnknownHostException
        {
                /*
                InetAddress[] arr = InetAddress.getAllByName("www.baidu.com");//会得到两个ip地址对象
                                                                                                                                        //如果传入的是ip地址,为什么得不到主机名

                for(InetAddress i : arr )
                {
                        System.out.println(i.getHostAddress());
                        System.out.println(i.getHostName());
                }
                */
               
                /*
                InetAddress i = InetAddress.getByName("www.baidu.com");//得到一个ip地址,
                                                                                                        //如果传入的是ip,为什么得不到主机名
                System.out.println(i.getHostAddress());
                System.out.println(i.getHostName());
                */
               
                InetAddress i = InetAddress.getByName("61.135.169.105");//如果传入的是ip,为什么得不到主机名
                System.out.println(i.getHostAddress());
                System.out.println(i.getHostName());

        }
}

问题:在静态方法getAllByName()和getByName()中,当传入的是主机名是,运行结果正常,但如果传入的是百度的ip地址,为什么得不到主机名呢?(网络正常)


作者: 张yy    时间: 2013-7-23 13:09
这个问题不是程序的方法问题,而是各地的Internet服务器供应商的DNS服务器配置的
情况不一样,也有可能是公司自己没有进行ip的逆向解析,也就是没有把ip翻译成为对应的域名

我们可以先不用程序,通过dos命令行的nslookup先来验证几个ip地址
首先,我们打开dos命令行,键入nslookup
然后输入www.baidu.com,服务器确实给我们解析出了两个百度的ip


但是我们输入115.239.210.26的时候,也许是服务器供应商,也许是百度自己没有进行ip地址的逆向解析设定
所以结果出现为:

也就是没有解析成为对应的域名,这样的话你的代码也就无法得出相应的名称了。

然后我们再来试试其他比较权威的网站,例如www.google.com

然后再键入:173.194.72.99,结果:

看来解析成功,不过解析的名字为tf-in-f99.1e100.net(这也许是google的其他形式的域名)
我们在浏览器中输入tf-in-f99.1e100.net或者是173.194.92.99,浏览器都会帮我们解析到
www.google.com了,看来173.194.92.99可以解析成google的域名了,也说明你在你的代码
中的 ip 处输入173.194.92.99,就会得到tf-in-f99.1e100.net

后面无聊又试了个地址,195.232.194.11对应的www.mobileforgoodsummit.com
代码和结果如下:
import java.net.*;


public class Dns {

        /**
         * @param args
         */
        public static void main(String[] args) throws UnknownHostException {
                InetAddress[] arr = InetAddress.getAllByName("www.baidu.com");
               
                for(InetAddress i : arr){
                         System.out.println(i.getHostAddress());
             System.out.println(i.getHostName());
                }
               
                InetAddress i = InetAddress.getByName("www.mobileforgoodsummit.com");
                System.out.println(i.getHostAddress());
        System.out.println(i.getHostName());

        InetAddress j = InetAddress.getByName("195.232.194.11");
        System.out.println(j.getHostAddress());
        System.out.println(j.getHostName());

        InetAddress x = InetAddress.getByName("www.google.com");
                System.out.println(x.getHostAddress());
        System.out.println(x.getHostName());

        InetAddress y = InetAddress.getByName("74.125.31.147");
        System.out.println(y.getHostAddress());
        System.out.println(y.getHostName());

        }

}


结果:
115.239.210.27
www.baidu.com
115.239.210.26
www.baidu.com
195.232.194.11
www.mobileforgoodsummit.com
195.232.194.11
mobileforgoodsummit.com
173.194.72.147
www.google.com
74.125.31.147
tb-in-f147.1e100.net


所以这个问题不是代码的问题,而是要看供应商是否设定了ip的逆向解析过程。

作者: 李政    时间: 2013-7-23 13:22
有点明白了
作者: 深圳在漂移    时间: 2013-7-23 13:46
学习了,我之前无聊也敲过这个代码
作者: 李政    时间: 2013-7-23 20:47
版主把问题改成解决吧,辛苦!
作者: 李政    时间: 2013-7-23 21:31

这道题出问题估计就是dns服务器的原因,再高深点的就不懂了,慢慢学习吧

网上搜索了一下Nslookup命令 感觉不错 不了解哥们儿看看

NSLOOKUP命令
关键词: NSLOOKUP命令 详解 网络命令

NSLOOKUP命令详解

Nslookup 是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具。 它在 Windows NT/2000/XP 中均可使用 , 但在 Windows 98 中却没有集成这一个工具。

  Nslookup 必须要安装了 TCP/IP 协议的网络环境之后才能使用。

  现在网络中已经架设好了一台 DNS 服务器, 主机名称为 ns-px.online.sh.cn , 它可以把域名 http://www.jsjzx.net 解析为 220.181.31.3 的 IP 地址, 这是我们平时用得比较多的正向解析功能。

检测步骤如下:

  在 Windows 2000 中单击 “ 开始 ” - >“ 程序 ” - >“ 附件 ” - >“ 命令提示符 ” ,在 C:\>  的后面键入 Nslookup www.jsjzx.net , “ 回车 ” 之后即可看到如下结果:

  Server: ns-px.online.sh.cn

  Address: 202.96.209.5

  Name: www.jsjzx.net

  Address: 220.181.31.3

  以上结果显示,正在工作的 DNS 服务器的主机名为 ns-px.online.sh.cn ,它的 IP 地址是 202.96.209.5 ,而域名 www.jsjzx.net 所对应的 IP 地址为 220.181.31.3 。那么,在检测到 DNS 服务器 ns-px.online.sh.cn 已经能顺利实现正向解析的情况下,它的反向解析是否正常呢 ? 也就是说, 能否把 IP 地址 220.181.31.3 反向解析为域名 www.jsjzx.net? 我们在命令提示符 C:\> 的后面键入 Nslookup 220.181.31.3 ,得到结果如下:

  Server: ns-px.online.sh.cn

  Address: 202.96.209.5

  Name: www.jsjzx.net

  Address: 220.181.31.3

  这说明, DNS 服务器 linlin 的反向解析功能也正常。

  然而,有的时候,我们键入 Nslookup www.jsjzx.net ,却出现如下结果:

  Server: ns-px.online.sh.cn

  Address: 202.96.209.5

  *** ns-px.online.sh.cn can't find www.jsjzx.net: Non-existent domain

这种情况说明网络中 DNS 服务器 ns-px.online.sh.cn 在工作,却不能实现域名 www.jsjzx.net 的正确解析。此时,要分析 DNS 服务器的配置情况,看是否 www.jsjzx.net 这一条域名对应的 IP 地址记录已经添加到了 DNS 的数据库中。

  还有的时候,我们键入 Nslookup www.jsjzx.net ,会出现如下结果

*** Can't find server name for domain: No response from server

*** Can't repairpc.nease.net : Non-existent domain

这时,说明测试主机在目前的网络中,根本没有找到可以使用的 DNS 服务器。此时,我们要对整个网络的连通性作全面的检测,并检查 DNS 服务器是否处于正常工作状态,采用逐步排错的方法,找出 DNS 服务不能启动的根源。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2