Java 编程中的联网包括了定位和识别资源的能力以及通过 TCP 和 UDP 连接进行通信的能力。首先,您需要识别具有象 www.ibm.com 这样名称的资源,然后打开到该资源的连接,最后在您自己和连接的另一端之间发送信息包。由于安全性原因,可能会包括其它任务,但是整个过程是一样的。对于 Java 平台,会在 java.net 包中找到支持这些操作的类。从 Java 编程的早期到现在,这些操作中大多数都未曾发生太大的变化。但是,随着 Merlin 的发展,这些基本操作中有些已经作了改进,以支持有价值的新功能。在本文中,我们将研究五个此类功能:IPv6 支持、URI、网络接口、非绑定套接字和安全套接字。
对 IPv6 地址的支持
首先让我们研究一下对下一代因特网协议 V6(Internet Protocol V6,IPv6)寻址体系结构的新支持。借助于 InetAddress 的两个新子类( Inet4Address 和 Inet6Address ),您能够与基于 TCP 和 UDP 的应用程序进行连接。 Inet4Address 支持大多数机器所支持的较旧的(而且通常是唯一的)IP 寻址样式,localhost 的格式为 127.0.0.1 。RFC2373(请参阅 参考资料)中所定义的新寻址方案提供了一种用冒号隔开的格式,其中 0:0:0:0:0:0:0:1 是与 127.0.0.1 等价的回送地址。新的类允许应用程序支持一种或这两种寻址方案。
对 IPv6 的支持取决于底层平台是否支持它,Solaris 8 和更高版本,以及 Linux 2.1.2 和更高(RedHat 6.1+)版本都支持 IPv6,而 Microsoft Windows 并不支持它(Microsoft 的 Window 2000 实现是个有限的实现)。希望 J2SE 1.4 的 Windows 版本以后能支持 IPv6。
认识统一资源标识符
java.net 包现已包括了统一资源标识符(uniform resource identifier,URI)类。可将 URI 看作是幕后没有协议处理程序的统一资源定位符(uniform resource locator,URL)。通常,URL 看上去象 http://www.ibm.com 。为了使 Java 语言运行时理解 URL,它需要知道该怎么处理以 http: 开头的信息。以前,如果您提出新协议(例如,象 jdbc:database ),那么若没有协议处理程序,则您不能将 jdbc:database 字符串作为 URL 处理。相反,您不得不严格地将它作为字符串处理,这正是 JDBC 现在所做的。
URI 的典型格式是: [scheme:][//authority][path][?query][#fragment] ,其中 authority 通常就是主机名。但是,它还可以包括用户登录信息和端口: [userInfo@]host[:port] 。URI 类自身提供了一系列的 getter 方法,以便了解 URI 各个特定的部分。在您先前传递看上去象 URL 的字符串(但这仅为了描述 URL 而非使用它)的地方,您应当使用该类。
用 NetworkInterface 列出网络连接
您是否曾经想知道哪个联网接口是可用的,但是在不回复到本机代码的情况下又不知道该如何询问呢?通常,连接至因特网的大多数机器中有两个连接:到其自身的本地循环和到其本地服务供应商的连接。但是,有些机器是 多宿主的。它们有多个网卡,每个网卡都有一个到因特网的独立连接并且都有自己的名称和地址。有了这个新的 NetworkInterface 接口,您就可以在向外发送多点广播数据报时指定使用哪个网卡,或查看网络连接是否正常。清单 1 演示了该类的用法:
清单 1. 列出网络接口
import java.net.*;
import java.util.Enumeration;
public class Nets {
public static void main(String args[]) throws SocketException {
Enumeration enum = NetworkInterface.getNetworkInterfaces();
while (enum.hasMoreElements()) {
NetworkInterface net = (NetworkInterface)enum.nextElement();
System.out.println(
"Names: " + net.getName() + " / " + net.getDisplayName());
Enumeration enum2 = net.getInetAddresses();
while (enum2.hasMoreElements()) {
InetAddress address = (InetAddress)enum2.nextElement();
System.out.println("\tAddress: " + address.getHostAddress());
}
}
}
}
您运行该程序所得的结果肯定是不同的。清单 2 包括了您想看到的输出样本:
清单 2. 清单 1 的样本结果
Names: lo / MS TCP Loopback interface
Address: 127.0.0.1
Names: eth0 / 3Com EtherLink PCI
Address: 192.168.0.109