Java核心技术·卷Ⅱ:高级特性(原书第10版)
上QQ阅读APP看书,第一时间看更新

4.1.2 用Java连接到服务器

程序清单4-1是我们的第一个网络程序。它的作用与我们使用telnet工具是相同的,即连接到某个端口并打印出它所找到的信息。

程序清单4-1 socket/SocketTest.java

下面是这个简单程序的几行关键代码:

第一行代码用于打开一个套接字,它也是网络软件中的一个抽象概念,负责启动该程序内部和外部之间的通信。我们将远程地址和端口号传递给套接字的构造器,如果连接失败,它将抛出一个UnknownHostException异常;如果存在其他问题,它将抛出一个IOException异常。因为UnknownHostException是IOException的一个子类,况且这只是一个示例程序,所以我们在这里仅仅捕获超类的异常。

一旦套接字被打开,java.net.Socket类中的getInputStream方法就会返回一个InputStream对象,该对象可以像其他任何流对象一样使用。而一旦获取了这个流,该程序将直接把每一行打印到标准输出。这个过程将一直持续到流发送完毕且服务器断开连接为止。

该程序只适用于非常简单的服务器,比如“当日时间”之类的服务。在比较复杂的网络程序中,客户端发送请求数据给服务器,而服务器可能在响应结束时并不立刻断开连接。在本章的若干个示例程序中,都会看到我们是如何实现这种行为的。

Socket类非常简单易用,因为Java库隐藏了建立网络连接和通过连接发送数据的复杂过程。实际上,java.net包提供的编程接口与操作文件时所使用的接口基本相同。

注意:本书所介绍的内容仅覆盖了TCP(传输控制协议)网络协议。Java平台另外还支持UDP(用户数据报协议)协议,该协议可以用于发送数据包(也称为数据报),它所需付出的开销要比TCP少得多。UDP有一个重要的缺点:数据包无需按照顺序传递到接收应用程序,它们甚至可能在传输过程中全部丢失。UDP让数据包的接收者自己负责对它们进行排序,并请求发送者重新发送那些丢失的数据包。UDP比较适合于那些可以忍受数据包丢失的应用,例如用于音频流和视频流的传输,或者用于连续测量的应用领域。

java.net.Socket 1.0

·Socket(String host,int port)

构建一个套接字,用来连接给定的主机和端口。

·InputStream getInputStream()

·OutputStream getOutputStream()

获取可以从套接字中读取数据的流,以及可以向套接字写出数据的流。