WEB开发网
开发学院软件开发Java 使用 Java 开发兼容 IPv6 的网络应用程序 阅读

使用 Java 开发兼容 IPv6 的网络应用程序

 2010-06-08 00:00:00 来源:WEB开发网   
核心提示: 由于 IPv6 协议所允许的网络地址格式较多,规范较宽松(例如零压缩地址,使用 Java 开发兼容 IPv6 的网络应用程序(4),IPv4 映射地址等),所以导致了 IPv6 网络地址的格式变化很大,尚未发现例外,以下是笔者用 Java 编写的对于 IPv6 网络地址的验证方法,Java 对于

由于 IPv6 协议所允许的网络地址格式较多,规范较宽松(例如零压缩地址,IPv4 映射地址等),所以导致了 IPv6 网络地址的格式变化很大。

Java 对于 IPv6 网络地址的验证是通过对输入字符的循环匹配做到的,并没有采取正则表达式的做法。其匹配过程中还依赖于其它的 Java 方法。

目前网络上流传的 IPv6 网络地址验证的正则表达式通常都只能涵盖部分地址格式,而且表达式冗长难读,非常不易于理解。

基于通用性考虑,以及为了使验证方法尽量简单易读,笔者尝试将 IPv6 网络地址的格式简单分类以后,使用多个正则表达式进行验证。

这种做法兼顾了通用性(基于正则表达式,所以方便用各种不同的编程语言进行实现),以及易读性(每个独立的正则表达式相对简短);并且根据测试,支持目前所有的 IPv6 网络地址格式类型,尚未发现例外。

以下是笔者用 Java 编写的对于 IPv6 网络地址的验证方法。此算法可被简单地用其它编程语言仿照重写。

清单 1. 验证地址

//IPv6 address validator matches these IPv6 formats 
//::ffff:21:7.8.9.221 | 2001:0db8:85a3:08d3:1319:8a2e:0370:7344 
//| ::8a2e:0:0370:7344 | 2001:0db8:85a3:08d3:1319:8a2e:100.22.44.55 
//| 2001:0db8::8a2e:100.22.44.55 | ::100.22.44.55 | ffff:: 
//And such addresses are invalid 
//::8a2e:0:0370:7344.4 | 2001:idb8::111:7.8.9.111 | 2001::100.a2.44.55 
//| :2001::100.22.44.55 
public static boolean isIPV6Format(String ip) { 
  ip = ip.trim(); 
 
  //in many cases such as URLs, IPv6 addresses are wrapped by [] 
  if(ip.substring(0, 1).equals("[") && ip.substring(ip.length()-1).equals("]")) 
   
    ip = ip.substring(1, ip.length()-1); 
 
    return (1 < Pattern.compile(":").split(ip).length) 
   //a valid IPv6 address should contains no less than 1, 
   //and no more than 7 “:” as separators 
      && (Pattern.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)); 
  }} 

上一页  1 2 3 4 5 6 7  下一页

Tags:使用 Java 开发

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接