18.2 JAVA和网络
现在准备工作已经完成,让我们看看Java怎样和所有的这些网络概念相联系。Java 通过扩展第17章介绍的已有的流式输入/输出接口和增加在网络上建立输入/输出对象特性这两个方法支持TCP/IP。Java支持TCP和UDP协议族。TCP用于网络的可靠的流式输入/输出。UDP支持更简单的、快速的、点对点的数据报模式。
18.2.1 网络类和接口
java.net 包所包含的类如下:
Authenticator (Java 2) JarURLConnection (Java 2) SocketPermission
ContentHandler MulticastSocket URL
DatagramPacket NetPermission URLClassLoader (Java 2)
DatagramSocket PasswordAuthentication (Java 2) URLConnection
DatagramSocketImpl ServerSocket URLDecoder (Java 2)
HttpURLConnection Socket URLEncoder
InetAddress SocketImpl URLStreamHandler
java.net包的接口如下:
ContentHandlerFactory SocketImplFactory URLStreamHandlerFactory
FileNameMap SocketOptions DatagramSocketImplFactory (Java 2, v1.3中添加的)
下面我们将讨论主要的网络类并且一些应用例子。
18.3 InetAddress类
无论你是在打电话、发送邮件或建立与Internet的连接,地址是基础。InetAddress 类用来封装我们前面讨论的数字式的IP地址和该地址的域名。你通过一个IP主机名与这个类发生作用,IP主机名比它的IP地址用起来更简便更容易理解。InetAddress 类内部隐藏了地址数字。
18.3.1 工厂方法
InetAddress 类没有明显的构造函数。为生成一个InetAddress对象,必须运用一个可用的工厂方法。工厂方法(factory method)仅是一个类中静态方法返回一个该类实例的约定。这是在一个带有各种参数列表的重载构造函数完成的,当持有惟一方法名时可使结果更清晰。对于InetAddress,三个方法 getLocalHost( )、getByName( )以及getAllByName( )可以用来创建InetAddress的实例。三个方法显示如下:
static InetAddress getLocalHost( )
throws UnknownHostException
static InetAddress getByName(String hostName)
throws UnknownHostException
static InetAddress[ ] getAllByName(String hostName)
throws UnknownHostException
getLocalHost( )仅返回象征本地主机的InetAddress 对象。getByName( )方法返回一个传给它的主机名的InetAddress 。如果这些方法不能解决主机名, 它们引发一个UnknownHostException异常。在Internet上,用一个名称来代表多个机器是很常有的事。Web服务器中,也有方法提供一定程度的缩放。getAllByName( )工厂方法返回代表由一个特殊名称分解的所有地址的InetAddresses类数组。在不能把名称分解成至少一个地址时,它将引发一个UnknownHostException异常。
下面的例子打印了本地机的地址和名称以及两个著名的Internet网址:
// Demonstrate InetAddress.
import java.net.*;
class InetAddressTest
{
public static void main(String args[]) throws UnknownHostException {
InetAddress Address = InetAddress.getLocalHost();
System.out.println(Address);
Address = InetAddress.getByName("osborne.com");
System.out.println(Address);
InetAddress SW[] = InetAddress.getAllByName("www.nba.com");
for (int i=0; i
System.out.println(SW[i]);
}
}
下面是该程序的输出(当然,你所看到的结果可能有一些不同):
default/206.148.209.138
osborne.com/198.45.24.130
www.nba.com/204.202.130.223