• 网络基础 InetAddress


    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秒)来提高性能。

    InetAddress类

    该类代表ip地址,下面还有两个子类,分别是Inet4Address和Inet6Address他们分别代表IPV4地址和IPV6地址

    该类没有构造器,可以通过它的两个静态方法来获取InetAddress的实例

     ipv4 ipv6 详见:  ipv4与ipv6 Inet4Address类和Inet6Address类

    getByName(String host) 根据主机名获取对应的InetAddress对象

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

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

    如果用域名作为getByName和getAllByName方法的参数得到的InetAddress对象,该对象会得到这个域名,当调用 getHostName时,就无需再访问DNS服务器,而是直接将这个域名返回。

    package com.my.socket;
    
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class ScocketTestt {
    
        public static void main(String[] args) throws UnknownHostException {
            // TODO Auto-generated method stub
            InetAddress address1 = InetAddress.getLocalHost(); //获取本机IP address
            
            ///通过IP 获取 IP address,如果IP地址不存在或DNS服务器不允许进行IP地址和域名映射,就返回这个IP地址。
    
            InetAddress address2 = InetAddress.getByName("192.168.0.100");//通过IP 获取 IP address        
            System.out.println(address2.getHostAddress());//ip
            System.out.println(address2.getAddress() instanceof byte[]); //byte[]
            System.out.println(address2.getAddress().length);// ip length
            System.out.println(address2.getHostName());//hostname
            
            //根据主机名(域名)获取对应的InetAddress对象,有时候一个域名可能绑定多个IP
            InetAddress[] address3 = InetAddress.getAllByName("www.baidu.com");
             for (InetAddress inetAddress : address3) {
                 System.out.println("baidu : "+inetAddress.getHostAddress());            
            }
        
            
            //通过byte[]源ip 例如  address2.getAddress() 获取  InetAddress 
             InetAddress address4 = InetAddress.getByAddress(address2.getAddress()) ;
             System.out.println(address4.getHostName());                                                    
    
        }
    
    }
    
    

    判断ip是 ipv4 还是ipv6的方法 

    根据 address2.getAddress().length 长度,或者address instanceof Inet4Address

    public class MyIP
    {
        public static void main(String[] args) throws Exception
        {
            if (args.length == 0)
                return;
            InetAddress address = InetAddress.getByName(args[0]);
            System.out.println("IP: " + address.getHostAddress());
            switch (address.getAddress().length)
            {
                case 4:
                    System.out.println("根据byte数组长度判断这个IP地址是IPv4地址!");
                    break;
                case 16:
                    System.out.println("根据byte数组长度判断这个IP地址是IPv6地址!");
                    break;
            }
            if (address instanceof Inet4Address)
                System.out.println("使用instanceof判断这个IP地址是IPv4地址!");
            else if (address instanceof Inet6Address)
                System.out.println("使用instanceof判断这个IP地址是IPv6地址!");
        }
    }

     getCanonicalHostName()方法

        定义:public String getCanonicalHostName()

       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

     

  • 相关阅读:
    学习笔记——Maven 如何处理传递性依赖
    gitlab 部署
    jenkins部署
    python 使用json格式转换
    php加载memcache
    centos6.5 apache+tomcat结合 负载均衡
    linux部署tomcat
    linux安装java环境
    kickstart安装
    cobbler部署
  • 原文地址:https://www.cnblogs.com/lukelook/p/11235992.html
Copyright © 2020-2023  润新知