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入门到精通教程
查看: 390|回复: 0

[网络编程学习]Java网络编程从入门到精通(2):创建InetAddress对象

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

    [LV.1]初来乍到

    发表于 2014-11-7 00:04:39 | 显示全部楼层 |阅读模式
    InetAddress类是java中用于描述IP地址的类。它在java.net包中。在Java中分别用Inet4Address和Inet6Address类来描述IPv4和IPv6的地址。这两个类都是InetAddress的子类。由于InetAddress没有public的 构造方法,因此,要想创建InetAddress对象,必须得依靠它的四个静态方法。    InetAddress可以通过getLocalHost方法得到本机的InetAddress对象,也可以通过getByName、getAllByName和getByAddress得到远程主机的InetAddress对象。
    一、getLocalHost方法 使用getLocalHost可以得到描述本机IP的InetAddress对象。这个方法的定义如下:
    public?static?InetAddress?getLocalHost()?
    throws?UnknownHostException 这个方法抛出了一个UnknownHostException异常,因此,必须在调用这个方法的程序中捕捉或抛出这个异常。下面的代码演示了如何使用getLocalHost来得到本机的IP和 计算机名。  
      
       
       
         
       

         
       
      



      
      
       
      package
       inet;


      import
       java.net.
      *
      ;


      public
       
      class
       MyInetAddress1
    {
         
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
         {
             InetAddress localAddress
      =
       InetAddress.getLocalHost();
             System.out.println(localAddress);        
         }
    }

      
      

      运行结果:

      
      
       
      ComputerName
      /
      192.168
      .
      18.10
      

      在InetAddress
      类中覆盖了Object
      类的toString
      方法,实现如下:
      
      
       
      public
       String toString()
    {

           return
       ((hostName
      !=
       
      null
      )
      ?
       hostName :
      ""
      )
      +
       
      "
      /
      "
       
      +
       getHostAddress();
    }

      

      从上面的代码 可以看出,InetAddress
      方法中的toString
      方法返回了用“/“
      隔 开的主机名和IP
      地址。因此,在上面的代码
      中
      直接通过localAddress
      对象来输出本机计算机名和IP
      地址(将对象参数传入println
      方法后,println
      方法会调用对象参数的toString
      方法来输出结果)。
      

      当本机绑定了 多个IP
      时,getLocalHost
      只返回第一个IP
      。 如果想返回本机全部的IP
      ,可以使用getAllByName
      方法。
      

      

    二、
    getByName方法
      

      这个方法是InetAddress
      类最常用的方法。它可以通过指定域名从DNS
      中得到相应的IP
      地 址。getByName
      一个String
      类型参数,可以通过这个参数指定远程主机的域名,它的定义如下:

      
      
       
      public
       
      static
       InetAddress getByName(String host)
      throws
       UnknownHostException
      
      

      如果host
      所指的域名对应多个IP
      ,getByName
      返回第一个IP
      。如果本机名已知,可以使用getByName
      方法来代替getLocalHost
      。当host
      的值是localhost
      时,返回的IP
      一 般是127.0.0.1
      。如果host
      是不存在的域名,getByName
      将抛出UnknownHostException
      异常,如果host
      是IP
      地址,无论这个IP
      地 址是否存在,getByName
      方法都会返回这个IP
      地址(因此getByName
      并不验证IP
      地址的正确性)。下面代码
      演示了如何使用getByName
      方法:

      
      
       
       
      package
       inet;
       
       
      import
       java.net.
      *
      ;
       
       
      public
       
      class
       
      MyInetAddress2
      

        {
          
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
           {
               
      if
       (args.length
      ==
       
      0
      )
                   
      return
      ;
               String host
      =
       args[
      0
      ];
               InetAddress address
      =
       InetAddress.getByName(host);
               System.out.println(address);
           }
       }

      
      
      
       测试1:远程主机www.csdn.net  
      

      执行如下命 令:

      
      
       
      java
      inet
      .MyInetAddress2 www.csdn.net
      

      运行结果:

      
      
       
      www.csdn.net
      /
      211.100
      .
      26.124
      
      
      测试2:本机名ComputerName  
      

      执行如下命 令:


      
      
       
      java
      inet
      .MyInetAddress2
       ComputerName
      

      运行结果:

      
      
       
      ComputerName
      /
      192.168
      .
      18.10
      
      
      测试3:代表本机的localhost  
      

      执行如下命 令:

      
      
       
      java
      inet
      .MyInetAddress2
       localhost
      

      运行结果:

      
      
       
      localhost
      /
      127.0
      .
      0.1
      

      对于本机来 说,除了可以使用本机名或localhost
      外,还可以在hosts
      文件中对本机做“IP/
      域名”
      映射(在Windows
      操作系统下)。这个文件在C:WINDOWSsystem32driversetc
      中。打开这两个文件中,在最后加一行如下所示的字符串:
      
      
       
      192.168
      .
      18.100
         www.mysite.com
      
      
      测试4:本机域名www.mysite.com  
      

      执行如下命 令:


      
      
       
      java
      inet
      .MyInetAddress2
       www.mysite.com
      

      运行结果:

      
      
       
      www.mysite.com
      /
      192.168
      .
      18.100
      

      getByName
      方法除了可以使用域名作为参数外,也可以直接使用IP
      地址作为 参数。如果使用IP
      地址作为参数,输出InetAddress
      对象时域名为空(除非调用getHostName
      方法后,再输出InetAddress
      对象。getHostName
      方法将在
      下面的内容介绍)。读者可以使用129.42.58.212
      作为
      MyInetAddress2
      的命令行参数(这是www.ibm.com
      的IP
      ),看看会得 到什么结果。

      

      

    三、
    getAllByName方法
      

      使用getAllByName
      方法可以从DNS
      上 得到域名对应的所有的IP
      。这个方法返回一个InetAddress
      类型的数组。这个方法的定义如下:
      
      
       
         
      public
       
      static
       InetAddress[] getAllByName(String host)
      throws
       UnknownHostException
      

         
      与getByName
      方法一样,当host
      不 存在时,getAllByName
      也会抛出UnknowHostException
      异常,getAllByName
      也不会验证IP
      地址 是否存在。下面的代码
      演示了getAllByName
      的用法:

      
      
       
       
      package
       inet;
       
       
      import
       java.net.
      *
      ;
       
       
      public
       
      class
       
      MyInetAddress3
      

        {
          
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
           {
               
      if
       (args.length
      ==
       
      0
      )
                   
      return
      ;
               String host
      =
       args[
      0
      ];
               InetAddress addresses[]
      =
       InetAddress.getAllByName(host);
               
      for
       (InetAddress address : addresses)
                   System.out.println(address);
           }
       }

      
      
      
      测试1:远程主机www.csdn.net  
      

      执行如下命 令:

      
      
       
      java
      inet
      .
      MyInetAddress3
       www.csdn.net
      

      运行结果:
      
      
       
      www.csdn.net
      /
      211.100
      .
      26.124
      
    www.csdn.net
      /
      211.100
      .
      26.121
      
    www.csdn.net
      /
      211.100
      .
      26.122
      
    www.csdn.net
      /
      211.100
      .
      26.123
      

      

      将上面的运行 结果和例程3-2
      的测试1
      的运行结果进行比较,可以得出一个结论,getByName
      方法返回的IP
      地址 就是getAllByName
      方法返回的第一个IP
      地址。事实上,getByName
      的确是这样实现的,getByName
      的实现代码如下:
      


      
       
      public
       
      static
       InetAddress getByName(String host)
      throws
       UnknownHostException
    {

           return
       InetAddress.getAllByName(host)[
      0
      ];
    }

      
      
       测试2:使用www.csdn.net的一个IP   
      

      执行如下命 令:

      
      
       
      java
      inet
      .
      MyInetAddress3
       
      211.100
      .
      26.122
      

      运行结果:
      
      
       
      /
      211.100
      .
      26.122
      
      

      

    四、
    getByAddress方法
      

      这个方法必须 通过IP
      地址来创建InetAddress
      对象,而且IP
      地址 必须是byte
      数组形式。getByAddress
      方法有两个重载形式,定义如下:
      
      
       
      public
       
      static
       InetAddress getByAddress(
      byte
      [] addr)
      throws
       UnknownHostException

      public
       
      static
       InetAddress getByAddress(String host,
      byte
      [] addr)
      throws
       UnknownHostException

      

      第一个重载形 式只需要传递byte
      数组形式的IP
      地址,getByAddress
      方法并不验证这个IP
      地址是否存在,只是简单地创建一个InetAddress
      对象。addr
      数 组的长度必须是4
      (IPv4
      )或16
      (IPv6
      ),如果是其他长度的byte
      数组,getByAddress
      将抛出一个UnknownHostException
      异常。第二个重载形式多了一个host
      ,这个host
      和getByName
      、getAllByName
      方法中的host
      的意义不同,getByAddress
      方法并不使用host
      在DNS
      上查找IP
      地址,这个host
      只 是一个用于表示addr
      的别名。下面的代码
      演示了getByAddress
      的两个重载形式的用法:


      
      
       
       
      package
       
      inet
      ;
       
       
      import
       java.net.
      *
      ;
       
       
      public
       
      class
       
      MyInetAddress4
      

        {
          
      public
       
      static
       
      void
       main(String[] args)
      throws
       Exception
           {
               
      byte
       ip[]
      =
       
      new
       
      byte
      [] { (
      byte
      )
      141
      , (
      byte
      )
      146
      ,
      8
       ,
      66
      };
               InetAddress address1
      =
       InetAddress.getByAddress(ip);
               InetAddress address2
      =
       InetAddress.getByAddress(
      "
      Oracle 官方网站
      "
      , ip);
               System.out.println(address1);
               System.out.println(address2);
           }
       }

      
      

      上面代码
      的运行结果如下:
      
      
       
      /
      141.146
      .
      8.66
      
    Oracle官方网站
      /
      141.146
      .
      8.66
      

      

          
      从上面的运行结果可以看出,getByAddress
      只是简单地将host
      参数作为域名放到“/”
      前面,因此,host
      可以是任何字符串。

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



      
      
       
       

         
       

         
       
      
    复制代码

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-25 10:09 , Processed in 0.367786 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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