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 = "\n==> ";
String splitLine = "\n----------------------------------------------------\n";
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

Java 检查IPv6地址的合法性的更多相关文章

  1. 判断IPv6地址合法性

    在 <netinet/in.h> 头文件下有下列这些宏用于判断IPv6地址合法性 返回0代表true,返回非零值代表ipv6地址为非指定类型的的地址(false) int IN6_IS_A ...

  2. Java支持IPv6研究

    1.Java对IPv6的支持 相对其他开发语言而言,Java对IPv6的支持是比较透明的, 如果全部采用域名(主机名)的方式进行通信,那么基本不需要修改也无需编译原来的代码就可以直接在IPv6上运行. ...

  3. IP地址(IPv4)/IPv6地址的正则表达式

    原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/ Pv4地址正则表达式:^((25[0-5]|2[0-4]\d ...

  4. 利用DNS AAAA记录和IPv6地址传输后门

    0x00 前言 在本文中,我想解释如何在DNS流量中利用IPv6地址(AAAA)记录传输Payload.在我之前的文章中,我解释了如何利用DNS和PTR记录,现在我们将讨论AAAA记录. 本文分为两部 ...

  5. java 获取ip地址和网络接口

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. 在 Linux 中自动配置 IPv6 地址

    在 Linux 中自动配置 IPv6 地址 在本文中,我们将学习如何为 ULA 自动配置 IP 地址. 何时使用唯一本地地址 唯一本地地址unique local addresses(ULA)使用 f ...

  7. 在centos服务器上启用ipv6地址

    随着互联网世界日新月异的发展,ipv6好像已经成为一种必不可少的趋势,但是当前国内机房大部分还不能支持ipv6,腾讯云亦如此.同时,现在有部分程序在服务器上运行的时候,需要服务器能监听一个ipv6地址 ...

  8. 浏览器访问IPv6地址

    http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...

  9. IPv6地址存储

    import java.util.Arrays; /** * @author: 何其有静 * @date: 2019/4/2 * @description: IPv6地址存储 * https://mp ...

随机推荐

  1. Django:总结setting中的配置

    一.Django setting配置说明 二.setting配置一览 一.Django setting配置说明 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包 ...

  2. <转载>c++中new一个二维数组

    原文连接 在c++中定义一个二维数组时有多种方式,下面是几种定义方式的说明:其中dataType 表示数据类型,如int  byte  long... 1.dataType (*num)[n] = n ...

  3. APP支付宝登录--PHP处理代码

    1.首先需要参数: aucth_code  udid re_id极光推送id 2.https://open.alipay.com/platform/keyManage.htm 配置公钥私钥 3.需要s ...

  4. 解决python中调用 imread 报错:ImportError: cannot import name imread

    安装了scipy后,报cannot import name imread错误, 1.网上查阅资料后说是需要安装pillow,安装pillow之后,仍然报该错误, 2.网上说是pillow与SciPy安 ...

  5. 【ZZNU-oj-2116:人间不值得】(1亿以内的货币拼音转数值求折扣价原价)--hash+String大法好+字符串处理+超大暴力模拟题

    B : 人间不值得 概览问题列表状态排名编辑 Progress Bar 时间限制:1 Sec 内存限制:256 MiB提交:146 答案正确:12 提交 编辑 题目描述 家缠万贯来几时,我今停杯一问之 ...

  6. duilib学习领悟(4)

    使用duilib创建的主窗口绘制工作全都发生在一个 真实存在的主窗口句柄当中,这个绘制过程稍稍有些复杂,但再复杂也逃不过WM_PAINT消息,所有的绘制工作也都由这个WM_PAINT消息完成.在上几篇 ...

  7. 评估类模型之优劣解距离法Topsis模型

    定义: TOPSIS法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距. 层次分析法的局限性: 问题和解决方案: 所以最终评分公式为: 指标正向化,得到正向 ...

  8. tarjan模板(带注释)

    //dfsn[x]记录x节点有没有被访问过,有,则是第几个 //lowlink[x]记录x能到的祖先中编号最小的 //dfs_clock是个编号累计器 //scc记录一个 inline void df ...

  9. 「CF484E」Sign on Fence「整体二分」「线段树」

    题意 给定一个长度为\(n\)的正整数序列,第\(i\)个数为\(h_i\),\(m\)个询问,每次询问\((l, r, w)\),为\([l, r]\)所有长度为\(w\)的子区间最小值的最大值.( ...

  10. 安装更新npm和nodejs

    1.安装npm sudo apt-get install npm 2.升级npm sudo npm install npm@latest -g 3.安装用于安装nodejs的模块n sudo npm ...