Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 364|回复: 0

[网络编程学习]Java网络编程从入门到精通(6):获取主机名

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-6 00:04:21 | 显示全部楼层 |阅读模式
    getCanonicalHostName
        方法和getHostName
        方法一样,也是得到远程主机的域名。但它们有一个区别。

    getCanonicalHostName
        得到的是主机名,而getHostName
        得到的主机别名。getCanonicalHostName
        的定义如下:
       

       

       
       
         
        public String getCanonicalHostName()
       
       
       
       
         在访问某些域名时,getCanonicalHostName
        方法和getHostName
        方法的返回值是一样的,这和DNS
        服务器如何解释主机名和主机别名以及它们的设置有关。如通过www.ibm.com
        创建InetAddress
        对象后,使用getCanonicalHostName
        方法和getHostName
        方法返回的结果都是www.ibm.com
        (有时直接返回IP
        地址,这可能和IBM
        的DNS
        服务器的处理机制有关)。如果DNS
        不允许通过IP
        地址得到域名,那么这两个方法就会返回IP
        地址来代替域名。

    getCanonicalHostName
        方法可以分三种情况来讨论:
         
      
       
       
         
       

         
       
      



      1. 使用
      getLocalHost
      创建
      InetAddress
      对象
      

      在这种情况下getCanonicalHostName
      方法和getHostName
      方法得到的都是本机名。
      

      

      

      2. 使用域名创建
      InetAddress
      对象
      

      在这种情况下,getCanonicalHostName
      方法是否要访问DNS
      服务器,取决于DNS
      服务器如何解释主机名和主机别名。也就是说,是否在创建InetAddress
      对象时就将主机名和主机别名都确定了。在前面已经讲过,使用域名创建InetAddress
      对象后,调用getHostName
      方法不会访问DNS
      服务器。但getCanonicalHostName
      方法就不一定了。这和DNS
      服务器的设置有关。如www.126.com
      就需要访问DNS
      服务器,而www.ibm.com
      就不需要访问DNS
      服务器。
      

      
    3

      
      使用
      IP
      地址创建
      InetAddress
      对象
      

          
      在这种情况下,getCanonicalHostName
      方法和getHostName
      方法是完全一样的,也就是说,它们得到的都是主机名,而不是主机别名。
      

      之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle
      官方网站的主机名
      bigip-otn-portal.oracle.com
      ,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如
      www.oracle.com
      。一个主机名可能对应多个主机别名,如
      oracle.com
      也是
      Oracle
      的主机别名。在
      IE
      的地址栏中输入
      http:// bigip-otn-portal.oracle.com
      和
      http://oracle.com
      都可以访问
      Oracle
      官方网站。但我们发现,有很多网站通过主机名无法访问,只有通过一些别名才能访问,如
      126
      只能通过
      www.126.com
      和
      126.com
      两个主机别名访问,而不能通过它的主机名
      zz-9-77-a8.bta.net.cn
      来访问。这是因为在服务端通过
      HTTP
      协议做了限制,这个在前面已经讨论过了。例程
      3-8
      对比了
      getCanonicalHostName
      和
      getHostName
      方法在不同情况下的输出结果。



      
      
       
      package
       mynet;


      import
       java.net.
      *
      ;


      public
       
      class
       DomainName
    {
         
      public
       
      static
       
      void
       outHostName(InetAddress address, String s)
         {
             System.out.println(
      "
      通过
      "
       
      +
       s
      +
       
      "
      创建InetAddress对象
      "
      );
             System.out.println(
      "
      主 机 名:
      "
       
      +
       address.getCanonicalHostName());
             System.out.println(
      "
      主机别名:
      "
       
      +
       address.getHostName());
             System.out.println(
      ""
      );
         }
         
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
         {
             outHostName(InetAddress.getLocalHost(),
      "
      getLocalHost方法
      "
      );
             outHostName(InetAddress.getByName(
      "
      www.ibm.com
      "
      ),
      "
      www.ibm.com
      "
      );
             outHostName(InetAddress.getByName(
      "
      www.126.com
      "
      ),
      "
      www.126.com
      "
      );
             outHostName(InetAddress.getByName(
      "
      202.108.9.77
      "
      ),
      "
      202.108.9.77
      "
      );
             outHostName(InetAddress.getByName(
      "
      211.100.26.121
      "
      ),
      "
      211.100.26.121
      "
      );
         }
    }

      
      

          
      运行结果

      
      
       
      通过getLocalHost方法创建InetAddress对象
    主 机 名:ComputerName
    主机别名:ComputerName

    通过www.ibm.com创建InetAddress对象
    主 机 名:www.ibm.com
    主机别名:www.ibm.com

    通过www.
      126
      .com创建InetAddress对象
    主 机 名:zz
      -
      9
      -
      77
      -
      a8.bta.net.cn
    主机别名:www.
      126
      .com

    通过202.
      108.9
      .77创建InetAddress对象
    主 机 名:zz
      -
      9
      -
      77
      -
      a8.bta.net.cn
    主机别名:zz
      -
      9
      -
      77
      -
      a8.bta.net.cn

    通过211.
      100.26
      .121创建InetAddress对象
    主 机 名:
      211.100
      .
      26.121
      
    主机别名:
      211.100
      .
      26.121
      

      
      

          
      从上面的运行结果可以看出,如果InetAddress
      对象是通过IP
      地址创建的,getCanonicalHostName
      方法和getHostName
      方法的值是完全一样的,它们的值可能是主机名,也可能是IP
      地址。而用域名创建的InetAddress
      对象就不一定了,它们的值可能相同(相同的IP
      地址或域名),也可能不相同,如上面运行结果中的www.126.com
      使用这两个方法得到的值就不同。在一般情况下,我们可以使用getHostName
      来获得域名,因为如果使用域名来创建InetAddress
      对象,getHostName
      所得到的域名就是用来创建InetAddress
      对象的域名,如果使用IP
      地址来创建InetAddress
      对象,getHostName
      方法等价于getCanonicalHostName
      方法。

      
    本文出自 “软件改变整个宇宙” 博客,请务必保留此出处http://androidguy.blog.51cto.com/974126/214809



      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/11/6/000421250.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 10:39 , Processed in 0.342156 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表