zoukankan      html  css  js  c++  java
  • Java 检查IPv6地址的合法性

    Java 检查IPv6地址的合法性


     

    由于IPv4资源即将耗尽,IPv6将要正式启用,这是大势所趋。

    一些现有的服务和应用逐步要对IPv6支持,目前还处在过渡阶段。

    提前了解一些IPv6的知识,还是有必要的。

    如何判断一个IP地址,是否为IPv6地址呢?

    以下代码是用Java实现的,用于校验IPv6地址合法性。

    代码如下:

    import java.text.Normalizer;
    import java.text.Normalizer.Form;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class IPV6Check {
     
        public static void main(String[] args) {
            String ipv6_1 = "2019:db8:a583:64:c68c:d6df:600c:ee9a";
            String ipv6_2 = "2019:db8:a583::9e42:be55:53a7";
            String ipv6_3 = "2019:db8:a583:::9e42:be55:53a7";
            String ipv6_4 = "1:2:3:4:5::192.168.254.254";
            String ipv6_5 = "ABCD:910A:2222:5498:8475:1111:3900:2020";
            String ipv6_6 = "1030::C9B4:FF12:48AA:1A2B";
            String ipv6_7 = "2019:0:0:0:0:0:0:1";
            String ipv6_8 = "::0:0:0:0:0:0:1";
            String ipv6_9 = "2019:0:0:0:0::";
            String ipv6_10= "2048:877e:31::7";
    
            String resultLine = "
    ==> ";
            String splitLine = "
    ----------------------------------------------------
    ";
            System.out.println(ipv6_1 + resultLine + isValidIpv6Addr(ipv6_1) + splitLine);
            System.out.println(ipv6_2 + resultLine + isValidIpv6Addr(ipv6_2) + splitLine);
            System.out.println(ipv6_3 + resultLine + isValidIpv6Addr(ipv6_3) + splitLine);
            System.out.println(ipv6_4 + resultLine + isValidIpv6Addr(ipv6_4) + splitLine);
            System.out.println(ipv6_5 + resultLine + isValidIpv6Addr(ipv6_5) + splitLine);
            System.out.println(ipv6_6 + resultLine + isValidIpv6Addr(ipv6_6) + splitLine);
            System.out.println(ipv6_7 + resultLine + isValidIpv6Addr(ipv6_7) + splitLine);
            System.out.println(ipv6_8 + resultLine + isValidIpv6Addr(ipv6_8) + splitLine);
            System.out.println(ipv6_9 + resultLine + isValidIpv6Addr(ipv6_9) + splitLine);
            System.out.println(ipv6_10 + resultLine + isValidIpv6Addr(ipv6_10) + splitLine);
        }
    
        /**
         * 校验IPv6地址的合法性
         * @param ipAddr
         * @return
         */
        public static boolean isValidIpv6Addr(String ipAddr) {
     
            String regex = "(^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4}){1}|:))"
                    + "|(([0-9A-Fa-f]{1,4}:){6}((:[0-9A-Fa-f]{1,4}){1}|"
                    + "((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                    + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                    + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                    + "(([0-9A-Fa-f]{1,4}:){5}((:[0-9A-Fa-f]{1,4}){1,2}|"
                    + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                    + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                    + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                    + "(([0-9A-Fa-f]{1,4}:){4}((:[0-9A-Fa-f]{1,4}){1,3}"
                    + "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                    + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|"
                    + "([0-9]){1,2})){3})|:))|(([0-9A-Fa-f]{1,4}:){3}((:[0-9A-Fa-f]{1,4}){1,4}|"
                    + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                    + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                    + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                    + "(([0-9A-Fa-f]{1,4}:){2}((:[0-9A-Fa-f]{1,4}){1,5}|"
                    + ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                    + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                    + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))"
                    + "|(([0-9A-Fa-f]{1,4}:){1}((:[0-9A-Fa-f]{1,4}){1,6}"
                    + "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"
                    + "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"
                    + "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"
                    + "(:((:[0-9A-Fa-f]{1,4}){1,7}|(:[fF]{4}){0,1}:((22[0-3]|2[0-1][0-9]|"
                    + "[0-1][0-9][0-9]|([0-9]){1,2})"
                    + "([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|([0-9]){1,2})){3})|:)))$)";
     
            if (ipAddr == null) {
                System.out.println("IPv6 address is null ");
                return false;
            }
            ipAddr = Normalizer.normalize(ipAddr, Form.NFKC);
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(ipAddr);
     
            boolean match = matcher.matches();
            if (!match) {
                 System.out.println("Invalid IPv6 address = " + ipAddr);
            }
     
            return match;
        }
     
    }

    运行结果如下:

    2019:db8:a583:64:c68c:d6df:600c:ee9a
    ==> true
    ----------------------------------------------------
    
    2019:db8:a583::9e42:be55:53a7
    ==> true
    ----------------------------------------------------
    
    Invalid IPv6 address = 2019:db8:a583:::9e42:be55:53a7
    2019:db8:a583:::9e42:be55:53a7
    ==> false
    ----------------------------------------------------
    
    1:2:3:4:5::192.168.254.254
    ==> true
    ----------------------------------------------------
    
    ABCD:910A:2222:5498:8475:1111:3900:2020
    ==> true
    ----------------------------------------------------
    
    1030::C9B4:FF12:48AA:1A2B
    ==> true
    ----------------------------------------------------
    
    2019:0:0:0:0:0:0:1
    ==> true
    ----------------------------------------------------
    
    ::0:0:0:0:0:0:1
    ==> true
    ----------------------------------------------------
    
    2019:0:0:0:0::
    ==> true
    ----------------------------------------------------
    
    2048:877e:31::7
    ==> true
    ----------------------------------------------------

    PS:

    Java 实现 bash命令
    https://www.cnblogs.com/miracle-luna/p/12050728.html

    Java 实现 ssh命令 登录主机执行shell命令
    https://www.cnblogs.com/miracle-luna/p/12050367.html

    Java 实现 telnet命令 验证主机端口的连通性
    https://www.cnblogs.com/miracle-luna/p/12049658.html

    Java 检查IPv6地址的合法性
    https://www.cnblogs.com/miracle-luna/p/12041780.html

    Java 实现判断 主机是否能 ping 通
    https://www.cnblogs.com/miracle-luna/p/12026797.html

  • 相关阅读:
    MySQL四种分区类型
    CentOS下升级MySQL 5.0.* 到5.5
    CentOS5.5使用yum来安装LAMP
    mysql-bin 常见操作
    引爆你的Javascript代码进化
    python读写excel的简单方法demo
    python时间戳数字转为字符串格式表达
    Djang——CSRF verification failed. Request aborted
    Apache部署django
    Qt设置windows系统时间
  • 原文地址:https://www.cnblogs.com/miracle-luna/p/12041780.html
Copyright © 2011-2022 走看看