InetAddress的测试

import java.net.InetAddress;
import java.net.UnknownHostException;

public class InetAddressTestMain {

    /*
     * 对于InetAddress的测试
     * 关键词:主机名、主机别名、ip地址、ipv4、ipv6
     * InetAddress是一个不可变对象
     * InetAddress是一个对象,包含3个属性:主机名称、主机别名、主机ip
     * 一个ip对应唯一一个主机名,一个主机名可以对应多个ip(一台计算机上有多个网络地址),一个域名可以对应多个ip(一个web服务有多台机器做负载均衡),一个ip也可以对应多个域名(多个web服务器在同一台机器上)
     * 一般的主机别名就是:网站的域名,为了便于记忆 ,DNS通过主机别名或者主机名都能找到相应的IP
     * 
     * @param args
     * @throws UnknownHostException 
     */
    public static void main(String[] args) throws UnknownHostException {
        System.out.println("对于InetAddress.getByName(host)  InetAddress.getAllByName(host) 的测试");
        //InetAddress.getByName(host)就相当于InetAddress.getAllByName(host)返回的数组取第一个,所以先只说InetAddress.getAllByName(host)
        //InetAddress.getAllByName(host)的参数可以是:域名(别名)、主机名、ip地址(ipv4:192.168.1.235  或者 ipv6)
        
        /*使用域名称来构造InetAddress ,例如:www.google.com
         * 1、构造时就需要连接网络,查询DNS,网络不通则报异常,无法创建成功
         * 2、此时域名显示的是就是域名,主机名显示的是真正的主机名称 。
         * 3、因为一个域名对应多个ip,所以会有多个InetAddress对象
         */
        InetAddress[] googleAddressList=InetAddress.getAllByName("www.google.com");
        for(InetAddress add:googleAddressList)
            System.out.println("ip地址是:"+add.getHostAddress()+" 域名(主机别名)是:"+add.getHostName()+" 主机名是:"+add.getCanonicalHostName());
        
        /*
         * 使用主机名来构造InetAddress ,例如hx-in-f147.1e100.net(google一台服务器的名称)
         * 1、同上面的测试一样:构造时就需要连接网络,查询DNS,网络不通则报异常,无法创建成功
         * 2、此时主机别名和主机名都显示的是hx-in-f147.1e100.net
         * 3、对应着唯一的一个ip地址
         */
        InetAddress[] googleReallyHostAddressList=InetAddress.getAllByName("hx-in-f147.1e100.net");
        for(InetAddress add:googleReallyHostAddressList)
            System.out.println("ip地址是:"+add.getHostAddress()+" 域名(主机别名)是:"+add.getHostName()+" 主机名是:"+add.getCanonicalHostName());
        
      /*
       * 使用ip地址来来构造InetAddress
       * 1、此时构造时不需要联网查询DNS
       * 2、此时的主机名 和 主机别名 均为空:InetAddress的canonicalHostName 和 hostName 均采用延迟加载的方式,当外界调用相应的get方法时,才取查询DNS获得
       * 3、若网络不通,即无法查询DNS,则使用该ip地址作为主机名和主机别名
       */
        InetAddress[] ipAddressList=InetAddress.getAllByName("74.125.71.99");
        for(InetAddress add:ipAddressList)
            System.out.println("ip地址是:"+add.getHostAddress()+" 域名(主机别名)是:"+add.getHostName()+" 主机名是:"+add.getCanonicalHostName());
        
        System.out.println("InetAddress.getByAddress(addr) 的测试;");
        /*
         * 这个同InetAddress.getAllByName() ,使用ip来构造是一样的 。
         */
        InetAddress byteAddress=InetAddress.getByAddress(ipAddressList[0].getAddress());
        System.out.println("ip地址是:"+byteAddress.getHostAddress()+" 域名(主机别名)是:"+byteAddress.getHostName()+" 主机名是:"+byteAddress.getCanonicalHostName());
        /*
         * 使用主机别名和ip来构造一个InetAddress,但是不检查相应的域名是否能解析,ip是否存在能连接。
         * 调用getCanonicalHostName()时候需要联网  。
         */
        InetAddress allInetAddress=InetAddress.getByAddress("hx-in-f147.1e100.net", ipAddressList[0].getAddress());
        System.out.println("ip地址是:"+allInetAddress.getHostAddress()+" 域名(主机别名)是:"+allInetAddress.getHostName()+" 主机名是:"+allInetAddress.getCanonicalHostName());
        
    }

}
posted @ 2012-09-29 14:53  hnrainll  阅读(2769)  评论(0编辑  收藏  举报