快速业务通道

使用Java开发兼容IPv6的网络应用程序 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
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 inetAddr = InetAddress.getByName(ipAddr); ipAddr = inetAddr.getHostAddress(); System.out.println(ipAddr);

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 地址

public static String getLocalIPv6Address() throws  IOException {    InetAddress inetAddress = null;    Enumeration<NetworkInterface> networkInterfaces =  NetworkInterface      .getNetworkInterfaces();    outer:    while (networkInterfaces.hasMoreElements()) {      Enumeration<InetAddress> inetAds =  networkInterfaces.nextElement()     .getInetAddresses();      while (inetAds.hasMoreElements()) {        inetAddress 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号