第3章Java网络编程在Internet被广泛使用的今天,网络编程就显得尤为重要。网络应用是Java语言取得成功的领域之一,Java现在已经成为Internet上最流行的一种编程语言。网络编程似乎需要面对复杂的网络知识。然而,用Java进行网络编程没有那么复杂。因为Java已经封装了网络底层技术、协议等。只需了解基本网络结构,就可轻松地用Java语言编写网络程序。本章将从服务器端和客户端重点介绍利用Socket实现网络通信的示例。通信前需要先创建一个连接,由客户端程序发起;而服务器端的程序需要一直监听着主机的特定端口号,等待客户端的连接。连接成功后收发数据。Java中的网络程序有TCP和UDP两种协议,TCP通过握手协议进行可靠的连接,UDP则是不可靠连接。3.1Java网络编程概述Java语言的网络功能非常强大,其网络类库不仅可以开发、访问Internet应用层程序,而且还可以实现网络底层的通信。【实例】编写程序,利用ServerSocket和Socket创建进行通信的简单程序。一旦建立通信连接后,仅由服务端向客户端发送一个字符串。1. 详细设计程序由服务端程序SimpleServer和客户端程序SimpleClient实现。服务端程序SimpleServer开放端口5432,并等待客户端连接,一旦有客户端连接过来,发出字符串"Hello Net World!"到客户端。客户端连接服务端成功后,接受服务端发来的字符串并进行显示。2. 编码实现1 等待与客户端连接语句如下: Socket socket=serversocket.accept;Get output stream associated with the socketOutputStream outputstream=socket.getOutputStream;DataOutputStream dataoutputstream=new DataOutputStreamoutputstream;分析: serversocket是ServerSocket对象,其accept方法等待客户端连接。一旦连接成功,利用Socket对象生成数据输出流,以便向客户端输出数据。2 发送数据语句如下: dataoutputstream.writeUTF"Hello Net World!";Close the connection, but not the server socketdataoutputstream.close;socket.close;分析: 通过数据输出流对象向客户端发送数据。3 客户端接收数据语句如下: Socket socket=new Socket"127.0.0.1", 5432;
Get an input stream from the socketInputStream inputstream=socket.getInputStream;Decorate it with a "data" input streamDataInputStream datainputstream=new DataInputStreaminputstream;
Read the input and print it to the screenSystem.out.printlndatainputstream.readUTF;
When done, just close the steam and connectiondatainputstream.close;socket.close;分析: 客户端首先通过socket连接服务端,再通过数据输入流接收服务端发来的数据。3. 源代码服务端SimpleServer类源代码如下: import java.net.;import java.io.;
public class SimpleServer {public static void mainString args\[\] {ServerSocket serversocket=null;try {serversocket=new ServerSocket5432;} catch IOException e { }
while true {try {等待与客户端连接Socket socket=serversocket.accept;Get output stream associated with the socketOutputStream outputstream=socket.getOutputStream;DataOutputStream dataoutputstream=new DataOutputStreamoutputstream;发送数据dataoutputstream.writeUTF"Hello Net World!";Close the connection, but not the server socketdataoutputstream.close;socket.close;} catch IOException e { }}}}注意如果用writeUTF发送数据,在接收端必须用readUTF读数据。客户端SimpleClient代码如下: import java.net.;import java.io.;
public class SimpleClient {public static void mainString args\[\] {try {Open your connection to a server, at port 5432localhost used hereSocket socket=new Socket"127.0.0.1", 5432;
Get an input stream from the socketInputStream inputstream=socket.getInputStream;Decorate it with a "data" input streamDataInputStream datainputstream=new DataInputStreaminputstream;
Read the input and print it to the screenSystem.out.printlndatainputstream.readUTF;
When done, just close the steam and connectiondatainputstream.close;socket.close;} catch ConnectException connExc {System.err.println"Could not connect to the server.";} catch IOException e {}}}注意UTF表示UCSUniversal Character Set传输格式。它是一种跨平台数据格式,在网络中进行数据交换一般采用这种格式。4. 测试与运行图31客户端接收服务端字符串运行时先启动服务端程序SimpleServer, 再启动客户端程序SimpleClient, 看到客户端接收到服务端发来的字符串,如图31所示。5. 技术分析1 网络基础一般情况下,在进行网络编程之前,程序员应该掌握与网络有关的知识,甚至对细节也应该非常熟悉。由于篇幅有限,这里只介绍必备的网络基础知识,详细内容请参看相关的书籍。1 OSI网络结构计算机网络是建立在结构化软件基础上的。计算机网络是按功能分级LEVEL或层LAYER的方式来组织的,下层为上层提供服务,如图32所示为层协议和接口。图32层协议和接口网络通信协议是计算机间进行通信所要遵循的各种规则的集合。OSI七层结构是国际标准化组织制定的计算机图33计算机网络体系结构的参考模型网络的体系结构参考模型,如图33所示。① 应用层: 应用层包含大量应用服务的协议。② 表示层: 完成某些特定的功能,它只关心语法和语艺。③ 会话层: 会话层允许不同的机器上的用户建立会话层关系。④ 传输层: 从上一层接收数据,必要时把它们分成适当的段传给网络层,并保证这些段可正确到达目的地。⑤ 网络层: 可将数据分组从源路由到目的地。⑥ 数据链路层: 提供一条可以无差错传输比特流的链路。⑦ 物理层: 在信道上传输原始的比特流。2 TCPIP协议TCPIPTransport Control ProtocolInternet Protocol是Internet的主要协议,定义了计算机和外设进行通信所使用的规则。TCPIP网络参考模型包括四个层次: 链路层、网络层、传输层、应用层。Internet的主要协议有: 网络层的IP协议,传输层的TCP和UDP协议,应用层的FTP、HTTP、SMTP等协议。每一层负责不同的功能,下面分别进行介绍。① 链路层: 也称为数据链路层或网络接口层。通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆或其他任何传输媒介的物理接口细节。② 网络层: 网络层对TCPIP网络中的硬件资源进行标识。连接到TCPIP网络中的每台计算机或其他设备都有唯一的地址,这就是IP地址。IP地址实际上是一个32位整数,通常以%d.%d.%d.%d的形式表示,其中,每个d都是一个8位整数。③ 传输层: 在TCPIP网络中,不同的机器之间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机器及应用程序,以及数据的质量控制等。TCPIP网络中最常用的传输协议TCPTransport Control Protocol和UDPUser Datagram Potocol就属于这一层。传输层通常以TCP和UDP协议来控制端点到端点的通信。用于通信的端点是由Socket来定义的,而Socket是由IP地址和端口号组成的。TCP协议是通过在端点与端点之间建立持续的连接而进行通信的。建立连接后,发送端对要发送的数据印记序列号和错误检测代码,并以字节流的方式发送出去;接收端则对数据进行错误检查并按序列顺序将数据整理好,在需要时可以重新发送数据,因此,整个字节流到达接收端时完好无缺。这与两个人打电话的情形类似。TCP协议具有可靠性和有序性等特性,并且以字节流的方式发送数据,通常被称为流通信协议。与TCP协议不同,UDP协议是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报Datagram,在数据报中指明数据所要达到的Socket主机地址和端口号,其次再将数据报发送出去。这种传输方式是无序的,也不能确保绝对安全可靠,但它非常简单,也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。TCP协议和UDP协议各有各的用处。当对所传输的数据有时序性和可靠性等要求时,应使用TCP协议;当传输的数据比较简单、对时序等无要求时,UDP协议能发挥更好的作用。④ 应用层: 大多数基于Tnternet的应用程序都被看作TCPIP的最上层协议应用层协议,例如ftp、http、smtp、pop3、telnet等协议。3 通信端口一台机器只通过一条链路连接到网络上,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要用到网络端口号port了。端口号是一个标记机器的逻辑通信信道的正整数,端口号不是物理实体。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的最后终节点,是TCP和UDP的基础。IP协议使用IP地址使数据投递到正确的计算机上,TCP和UDP协议使用端口号将数据投递给正确的应用程序。端口号是用一个16位的整数来表示的,其范围为0~65535,其中,0~1023被系统保留,专门用于那些通用的服务wellknown service。例如,HTTP服务的端口号为80,Telnet服务的端口号为21,FTP服务的端口号为23等。因此,当编写通信程序时,应选择一个大子1023的数作为端口号,以免发生冲突。4 URL概念URL是统一资源定位器Uniform Resource Locator的简称,它表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图像文件、声音文件、动画文件以及其他任何内容并不完全是文件,也可以是对数据库的一个查询等。通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在