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:\WINDOWS\system32\drivers\etc 中。打开这两个文件中,在最后加一行如下所示的字符串:
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 可以是任何字符串。