使用 Java 开发兼容 IPv6 的网络应用程序
2010-06-08 00:00:00 来源:WEB开发网Windows 2008 和 Windows Vista:既可以使用 Windows 网络属性页面进行配置,也可以使用类似 Windows 2003 和 Windows XP 的 netsh 命令行来配置
Linux 系统 (以下是 IPv6 的临时配置方法,即不修改配置文件,计算机重启后配置失效)
Redhat Linux:最简单的方法是使用 ifconfig 命令行添加 IPv6 地址,例如:ifconfig eth0 inet6 add 2002:92a:8f7a:100:10:14:24:106/96。
SUSE Linux:同上。
从实践上讲,由于 Java 的面向对象特性,以及 java.net 包对于 IP 地址的良好封装,从而使得将 Java 应用从 IPv4 环境移植到 IPv4/IPv6 双环境,或者纯 IPv6 环境变得异常简单。通常我们需要做的仅是检查代码并移除明码编写的 IPv4 地址,用主机名来替代则可。
除此以外,对于一些特殊的需求,Java 还提供了 InetAddress 的两个扩展类以供使用:Inet4Address 和 Inet6Address,其中封装了对于 IPv4 和 IPv6 的特殊属性和行为。然而由于 Java 的多态特性,使得程序员一般只需要使用父类 InetAddress,Java 虚拟机可以根据所封装的 IP 地址类型的不同,在运行时选择正确的行为逻辑。所以在多数情况下,程序员并不需要精确控制所使用的类型及其行为,一切交给 Java 虚拟机即可。
具体的新增类型及其新增方法,请具体参阅 Sun 公司的 JavaDoc。
另外,在 IPv4/IPv6 双环境中,对于使用 Java 开发的网络应用,比较值得注意的是以下两个 IPv6 相关的 Java 虚拟机系统属性。
java.net.preferIPv4Stack=<true|false>
java.net.preferIPv6Addresses=<true|false>
preferIPv4Stack(默认 false)表示如果存在 IPv4 和 IPv6 双栈,Java 程序是否优先使用 IPv4 套接字。默认值是优先使用 IPv6 套接字,因为 IPv6 套接字可以与对应的 IPv4 或 IPv6 主机进行对话;相反如果优先使用 IPv4,则只不能与 IPv6 主机进行通信。
preferIPv6Addresses(默认 false)表示在查询本地或远端 IP 地址时,如果存在 IPv4 和 IPv6 双地址,Java 程序是否优先返回 IPv6 地址。Java 默认返回 IPv4 地址主要是为了向后兼容,以支持旧有的 IPv4 验证逻辑,以及旧有的仅支持 IPv4 地址的服务。
总结
从计算机技术的发展、因特网的规律和网络的传输速率来看,IPV4 都已经不适用了。其中最主要的问题就是 IPV4 的 32 比特的 IP 地址空间已经无法满足迅速膨胀的因特网规模,但是 IPv6 的引入为我们解决了 IP 地址近乎枯竭的问题。本文对 IPv6 地址做了一些基本的介绍,着重介绍了如何使用 Java 开发兼容 IPv6 的网络应用程序,包括如何验证 IPv6 地址,如何正规化 IPv6 地址的表示,如何获取本机 IPv6 的地址,以及在 IPv4/IPv6 双地址环境下的网络选择和测试,同时作者结合在日常工作中使用的 Java 代码片段,希望呈现给读者一个全方位的、具有较强实用性的文本介绍,也希望本文能给读者在以后使用 Java 开发 IPv6 兼容程序的过程中带来一些帮助。
更多精彩
赞助商链接