Java 本身的API对于ipv6的支持并不够。
一般情况下我们用Java的API解析,输出IP地址是:2300:0:0:0:0:0:0:1 而不是:2300::1
但是参照RFC5952,ipv6格式的地址表示是:
处理16-bit 字段中的前导零
前导零不允许出现。例如,2001:0db8::0001是不能接受的,必须表示为2001:db8::1。一个16 -位0000字段必须表示为0。
“::”使用,ip地址要尽可能的缩短
例如,2001:db8:0:0:0:0:2:1必须缩短为2001:db8::2:1。同样,2001:db8::0:1也不能接受,因为符号“::”本可以用于生成更短的表示2001:db8::1。
处理一个16-bit 0字段
符号“::”不能仅用于缩短一个16-bit 0字段。例如,2001:db8:0:1:1:1:1:1是正确的,但是2001:db8::1:1:1:1:1是不正确的。
“::”位置的选择
“::” 只能出现一次,所以有时需要做出选择,
例如: 2001:0:0:1:0:0:0:1, 需要缩短最长的连续0, 缩短为: 2001:0:0:1::1)。
当连续0的数量相等时,缩短第一个连续0,
例如: 2001:db8:0:0:1:0:0:1 缩短为 2001:db8::1:0:0:1
小写字母表示
IPv6地址中的字符“a”、“b”、“c”、“d”、“e”和“f”, 必须用小写字母表示。
基于上面的标准,java自身提供的API并不能满足要求。
需要使用google提供的API.
使用方法:
添加Maven依赖
com.googlecode.java-ipv6
java-ipv6
0.17
代码示例
final IPv6Address iPv6Address = IPv6Address.fromString("fe80::226:2dff:fefa:cd1f");
final IPv6Address iPv4MappedIPv6Address = IPv6Address.fromString("::ffff:192.168.0.1");
详细的使用手册参见官网,本文只提供一种思路和方法。