使用Java开发兼容IPv6的网络应用程序 - 编程入门网
compile(":").split(ip).length <= 8)
//the address can be compressed, but “::” can appear only once
&& (Pattern.compile("::").split(ip).length <= 2)
//if a compressed address
&& (Pattern.compile("::").split(ip).length == 2)
//if starts with “::” – leading zeros are compressed
? (((ip.substring(0, 2).equals("::"))
? Pattern.matches("^::([\\da-f]{1,4}(:)){0,4}(([\\da- f]{1,4}(:)[\\da-f]{1,4})
|([\\da-f]{1,4})|((\\d{1,3}.){3}\\d{1,3}))", ip)
: Pattern.matches("^([\\da-f]{1,4}(:|::)){1,5}
(([\\da-f]{1,4}(:|::)[\\da-f]{1,4})|([\\da-f]{1,4})
|((\\d{1,3}.){3}\\d{1,3}))", ip)))
//if ends with "::" - ending zeros are compressed
: ((ip.substring(ip.length()-2).equals("::"))
? Pattern.matches("^([\\da-f]{1,4}(:|::)){1,7}", ip)
: Pattern.matches("^([\\da-f]{1,4}:){6}(([\\da-f] {1,4}
:[\\da-f]{1,4})|((\\d{1,3}.){3}\\d{1,3}))", ip));
}}
使用Java开发兼容IPv6的网络应用程序(4)时间:2011-09-04 IBM 朱益盛 杨晖 傅啸如何正规化 IPv6 地址 在网络程序开发中,经常使用 IP 地址来标识一个主机,例如记录终端用户的 访问记录等。由于 IPv6 具有有零压缩地址等多种表示形式,因此直接使用 IPv6 地址作为标示符,可能会带来一些问题。为了避免这些问题,在使用 IPv6 地址 之前,有必要将其正规化。除了通过我们熟知的正则表达式,笔者在开发过程中 发现使用一个简单的 Java API 也可以达到相同的效果。 清单 2. 正规化地址
InetAddress.getByName(String) 方法接受的参数既可以是一个主机名,也可 以是一个 IP 地址字符串。我们输入任一信息的合法 IPv6 地址,再通过 getHostAddress() 方法取出主机 IP 时,地址字符串 ipAddr 已经被转换为完整 形式。例如输入 2002:97b:e7aa::97b:e7aa,上述代码执行过后,零压缩部分将 被还原,ipAddr 变为 2002:97b:e7aa:0:0:0:97b:e7aa。 如何获取本机 IPv6 地址 有时为了能够注册 listener,开发人员需要使用本机的 IPv6 地址,这一地 址不能简单得通过 InetAddress.getLocalhost() 获得。因为这样有可能获得诸 如 0:0:0:0:0:0:0:1 这样的特殊地址。使用这样的地址,其他服务器将无法把通 知发送到本机上,因此必须先进行过滤,选出确实可用的地址。以下代码实现了 这一功能,思路是遍历网络接口的各个地址,直至找到符合要求的地址。 清单 3. 获取本机 IP 地址
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |