zoukankan      html  css  js  c++  java
  • IP和java.net.InetAddress类的使用

    一、IP

    1、地址格式

    互联网上每一台计算机都有一个唯一标示自己的标记,这个标记就是IP地址。IP 地址使用32 位长度二进制数据标示,一般在实际中看到的大部分IP地址都是以十进制的数据形式标示的,如:192.168.1.3,IP地址格式如下:

    IP 地址 = 网络地址 + 主机地址

    网络号:用于识别主机所在的网络

    主机号:用于识别网络中的主机

    2、地址分类

    IP地址按照数字区域,分为5类,如下所示:

    A 类:政府机构

    B 类:中等规模的公司

    C 类:任何需要的人

    D 类:用于组播

    E 类:用于实验

    二、InetAddress

    1.1. 简介

    IP地址是IP使用的32位(IPv4)或者128位(IPv6)位无符号数字,它是传输层协议TCP,UDP的基础。InetAddress是Java对IP地址的封装,在java.net中有许多类都使用到了InetAddress,包括ServerSocket,Socket,DatagramSocket等等。

    InetAddress的实例对象包含以数字形式保存的IP地址,同时还可能包含主机名(如果使用主机名来获取InetAddress的实例,或者使用数字来构造,并且启用了反向主机名解析的功能)。InetAddress类提供了将主机名解析为IP地址(或反之)的方法。

    InetAddress对域名进行解析是使用本地机器配置或者网络命名服务(如域名系统(Domain Name System,DNS)和网络信息服务(Network Information Service,NIS))来实现。对于DNS来说,本地需要向DNS服务器发送查询的请求,然后服务器根据一系列的操作,返回对应的IP地址,为了提高效率,通常本地会缓存一些主机名与IP地址的映射,这样访问相同的地址,就不需要重复发送DNS请求了。在java.net.InetAddress类同样采用了这种策略。在默认情况下,会缓存一段有限时间的映射,对于主机名解析不成功的结果,会缓存非常短的时间(10秒)来提高性能。

    1.2. InetAddress对象的获取

    InetAddress的构造函数不是公开的(public),所以需要通过它提供的静态方法来获取,有以下的方法:

    static InetAddress[] getAllByName(String host)
    
    static InetAddress getByAddress(byte[] addr)
    
    static InetAddress getByAddress(String host,byte[] addr)
    
    static InetAddress getByName(String host)
    
    static InetAddress getLocalHost()

    在这些静态方法中,最为常用的应该是getByName(String host)方法,只需要传入目标主机的名字,InetAddress会尝试做连接DNS服务器,并且获取IP地址的操作。

    InetAddress address=InetAddress.getByName("www.baidu.com");

    注意到这些方法可能会抛出的异常。如果安全管理器不允许访问DNS服务器或禁止网络连接,会抛出SecurityException,如果找不到对应主机的IP地址,或者发生其他网络I/O错误,这些方法会抛出UnknowHostException

    1.3 getHostName() 方法

        定义:public String getHostName()

        根据创建InetAddress对象的不同方式,getHostName的返回值是不同的。

     1. 用 getLocalHost() 方法创建的InetAddress的对象

            此时getHostName返回的是本机名

            InetAddress address=InetAddress.getLocalHost();

            System.out.println(address.getHostName());//返回本机名

       2. 用域名创建 InetAddress对象

            用域名作为getByName和getAllByName方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用

            getHostName时,就无需再访问DNS服务器,而是直接将这个域名返回

    1 InetAddress address=InetAddress.getByName("ZZQ");  
    2 System.out.println(address.getHostName());//不必再访问DNS服务器,直接返回域名 

      3. 用IP地址 创建InetAddress对象

            使用IP地址创建InetAddress对象(getByName,getAllByName,getByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。

            如果IP地址不存在或DNS服务器不允许进行IP地址和域名映射,就返回这个IP地址。

    1 InetAddress address=InetAddress.getByName("141.146.8.66");  
    2 System.out.println(address.getHostName());//需要访问DNS服务器才能得到域名  
    3 InetAddress address=InetAddress.getByName("1.2.3.4");//IP地址不存在  
    4 System.out.println(address.getHostName());//直接返回IP地址  

    1.4 getCanonicalHostName()方法 

        定义:public String getCanonicalHostName()

        该方法和getHostName方法一样,也是得到远程主机的域名。区别是,该方法得到的是主机名,getHostName得到的是主机别名。

        1. 使用 getLocalHost() 创建InetAddress对象

            此时getCanonicalHostName方法和getHostName方法得到的都是本机名

        2. 使用域名 创建InetAddress对象

            使用域名创建InetAddress对象后,getHostName方法不会访问DNS服务器

            但getCanonicalHostName方法就不一定了,这取决于DNS服务器如何解释主机名和主机别名

        3. 使用IP地址 创建InetAddress对象

            此时getCanonicalHostName方法和getHostName方法完全相同,返回的都是主机名,而不是主机别名。

            之所以要使用主机别名,是因为有时主机名可能比较复杂,如Oracle官方网站的主机名bigip-otn-

            portal.oracle.com,因此,为了使用户访问网站更方便,就增加了更简单的主机别名,如 www.oracle.com

    1.5 getHostAddress()方法

        定义:public String getHostAddress()

        该方法用来得到主机的IP地址,这个IP地址可以是IPv4也可以是IPv6的

        无论InetAddress对象是用哪种方式创建,getHostAddress方法都不会访问DNS服务器。

    复制代码
     1 public static void getHostAddressTest() throws UnknownHostException {  
     2         // 输出IPv4地址  
     3         InetAddress ipv4Address1 = InetAddress.getByName("1.2.3.4");  
     4         System.out.println("ipv4Address1:" + ipv4Address1.getHostAddress());  
     5         //ipv4Address1:1.2.3.4  
     6         InetAddress ipv4Address2 = InetAddress.getByName("www.ibm.com");  
     7         System.out.println("ipv4Address2:" + ipv4Address2.getHostAddress());  
     8         //ipv4Address2:129.42.60.216  
     9         InetAddress ipv4Address3 = InetAddress.getByName("ZZQ");  
    10         System.out.println("ipv4Address3:" + ipv4Address3.getHostAddress());  
    11         //ipv4Address3:192.168.1.105  
    12         // 输出IPv6地址  
    13         InetAddress ipv6Address1 = InetAddress.getByName("abcd:123::22ff");  
    14         System.out.println("ipv6Address1:" + ipv6Address1.getHostAddress());  
    15         //ipv6Address1:abcd:123:0:0:0:0:0:22ff  
    16         InetAddress ipv6Address2 = InetAddress.getByName("www.neu6.edu.cn");  
    17         System.out.println("ipv6Address2:" + ipv6Address2.getHostAddress());  
    18         //ipv6Address2:2001:da8:9000:b255:210:5cff:fef5:ac49  
    19         // 输出本机全部的IP地址  
    20         InetAddress Addresses[] = InetAddress.getAllByName("ZZQ");  
    21         for (InetAddress address : Addresses)  
    22             System.out.println("本机地址:" + address.getHostAddress());  
    23         //本机地址:192.168.1.105  
    24         //本机地址:0.1.0.4  
    25         //本机地址:0:0:0:0:0:0:0:1  
    26     }  
    复制代码

    1.6 getAddress()方法

        定义:public byte[] getAddress()

        该方法和getHostAddress方法唯一区别是,getHostAddress返回字符形式的IP地址,getAddress返回byte数组形式的IP地址。

    复制代码
     1 public static void getAddressTest() throws UnknownHostException {  
     2         InetAddress address = InetAddress.getByName("www.csdn.net");  
     3         byte ip[] = address.getAddress();  
     4         for (byte ipSegment : ip)  
     5             System.out.print(ipSegment + ".");  
     6         System.out.println("");  
     7         //-53.81.21.61  
     8         /*  
     9          * byte数组是有符号的。在Java中byte类型的取值范围是-128~127. 
    10          * 如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数。 
    11          * 由于Java中没有无符号byte类型,因此,要想显示正常的IP地址,必须使用int或long类型。 
    12          */  
    13         for (byte ipSegment : ip) {  
    14             int newIPSegment = (ipSegment < 0) ? 256 + ipSegment : ipSegment;  
    15             System.out.print(newIPSegment + ".");  
    16         }  
    17         //203.81.21.61  
    18     }  
    复制代码

     

     

  • 相关阅读:
    border-radius
    border-style
    border-width
    border
    max-width
    min-width
    clip 语法
    left
    z-index
    position
  • 原文地址:https://www.cnblogs.com/shamo89/p/8497136.html
Copyright © 2011-2022 走看看