1、第17章 网络编程实例局域网通信软件,Java语言具有非常强大的网络应用开发能力。本章通过实现一个简单的局域网通信软件,展示了Java语言网络编程知识在实际系统开发过程中的具体应用。本章实例主要涉及Java网络编程知识和Java图形界面编程知识。,17.1 实 例 概 述,本章的实例将开发一款用于局域网内通信的软件。该通信软件采用“客户端服务器”模式。服务器负责提供通信服务,如建立连接、处理请求数据等,并能与客户机对等地交互发送消息。客户机可以向服务器发送连接请求。连接建立后可以与服务器互发消息进行通信。该软件的工作流程大致如图所示。,17.2 系 统 设 计,对系统需求进行了充分的分析之后,
2、在具体开发之前需要进行一下总体设计。系统设计包括系统总体结构、构建开发环境、确定系统工程目录这几个方面,下面分别对其进行介绍。,17.2.1 系统总体结构,在对整个系统进行需求分析后,将系统功能划分为服务器端程序和客户端程序两大块。系统的功能结构图如图所示。其中,服务器端程序主要用于监听客户端的连接请求,连接建立后能够与客户端进行通信。客户端程序负责向服务器发出连接请求,连接建立后能够与服务器端进行通信。另外,两端的程序在一方断开后都能自动向对方发送信息提示。,17.2.2 构建开发环境,本系统是Java网络编程方面应用的实例。对于通信过程中的数据没有进行持久性保存,所以不需采用数据库系统。根
3、据系统的实际情况,可采用如下的开发环境。 操作系统:Windows7; 编程语言:JDK 1.7; 开发工具:Eclipse 4.0。,17.2.3 系统工程目录,在开发一个实际应用系统的时候,应该规划好系统工程的文件结构。有规划的工程文件结构便于在开发过程中进行管理,也使得开发工作的内容更加清晰。在Eclipse开发环境下,本系统最终的工程目录结构如图所示。系统的工程名称为jywtx,所包含的文件夹及功能包主要包括以下几个方面。 src目录:用于存放系统的所有源代码。源代码按照包结构进行组织。 business包:存放业务实现类。 util包:存放系统的实用工具类,为其他包共用。 windo
4、w包:存放系统的图形界面窗口类。,17.3 公 共 模 块,在系统开发过程中,经常需要设计一些公共模块,供系统中其他模块共同调用。本系统的公共模块主要由util包来实现。util包主要用于存放一些实用工具类,系统所有模块中经常需要使用的一些工具类或系统常量等可以在该包中定义。 本系统的util包只定义了一个Constant类,用于定义系统常量。 Constant类共定义了3个常量。其中,SERVER_HOST常量表示服务器主机的IP地址,主要供客户端请求连接使用。LISTEN_PORT常量表示服务器主机监听的端口号。CONNECT_QUIT常量为退出标识,用于服务器和客户端断开连接时向对方发送
5、退出的标志。,17.4 服务器端程序,服务器端程序主要用于监听客户端的连接请求。当客户端请求连接后能够处理请求信息,连接建立后能够与客户端进行通信等。,17.4.1 工作流程,服务器端程序的工作流程图如图所示。,17.4.1 工作流程,下面对上述流程图做下简要说明。 (1)服务器端以指定端口号为参数,创建一个ServerSocket对象,监听该端口。 (2)服务器端程序使用ServerSocket对象的accept()方法,接收来自客户机程序的连接请求。此时服务器端将一直保持阻塞状态,直到收到客户端发来的连接请求。 (3)accept()方法接收到客户端请求后返回Socket对象,连接成功建立
6、。 (4)使用Socket对象创建输入、输出流对象。使用流对象的方法完成和客户端的数据传输。其中,包括处理接收到的客户端信息及向客户端发送信息两种操作。 (5)客户端工作完毕后,关闭和客户端通信的流和通信的Socket,并进入下一次循环。,17.4.2 源程序,服务器端程序主要由business包的Server.java和window包的ServerFrame.java两个文件组成。,17.4.3 程序解释,下面对上述源程序中的关键实现部分给予重点说明。 (1)程序入口为Server类的main()方法。main()方法创建了Server类的实体。服务器端界面的生成和监听服务的启动都是在Ser
7、ver类的构造方法中完成的。 (2)Server类的构造方法中首先创建了图形界面ServerFrame类的实体,并将其设置为可见。 服务器端图形界面的主要实现类为window.ServerFrame。其中,ServerFrame类提供了一个public方法display()。服务器端业务程序Server类可以调用该方法在图形界面上半部的文本区域内显示相关文字信息。 (3)显示完图形界面后,Server类的构造方法调用startServer()方法启动服务。startServer()方法实现了端口监听、建立连接、通信等服务器端程序的主要核心业务。所以它也是服务器端程序的实现重点。,17.4.3
8、程序解释,(4)startServer()方法首先创建了ServerSocket类的实例,开始监听指定端口。该方法被设计成每次只接收一个客户端的连接请求。直到与当前客户端通信完成断开连接后,才开始接收下一个客户端的请求。在程序实现上,对一个客户端的通信过程都是在while循环中完成的。一次迭代服务一个客户端。监听端口的同时在图形界面上显示“等待连接”的提示信息。此时,服务器端程序处于阻塞状态,直到接收到客户端的连接请求。 (5)待接收到客户端的连接请求后,程序在图形界面上显示相关的连接信息。此时,服务器端与客户端的连接已经建立,双方可以互发消息进行通信。服务器端发送消息的操作方法为,在图形界面
9、左下角的文本域内输入相应文本,然后单击“发送”按钮。当前客户端图形界面上即会显示服务器端发来的消息内容。 (6)上述循环退出的条件为收到的标识为退出连接的消息。触发退出连接行为的动作可能为客户端输入退出标识信息、客户端直接关闭了操作界面等。这些动作都会为服务器端程序自动发送退出连接的消息。服务器端程序接收到退出连接的消息后,退出无限循环。结束当前客户端的连接,并在图形界面上显示相关信息。结束当前连接后,程序关闭相应的输入、输出流,进入下一次循环迭代,等待下一个客户端连接。,17.5 客户端程序,比较服务器端来说,客户端程序相对简单。客户端程序主要用于向服务器端发出连接请求,连接建立后能够与服务
10、器端进行通信。,17.5.1 工作流程,客户端程序的工作流程图如图所示。,17.5.1 工作流程,下面对上述流程图做下简要说明。 (1)客户端以指定主机、指定端口号为参数,创建一个Socket对象。 (2)向服务器端发出连接请求。连接成功建立后返回Socket对象。 (3)使用Socket对象创建输入、输出流对象。使用流对象的方法完成向服务器端发送和接收数据。 (4)通信完毕后,关闭和服务器端通信的流和Socket。,17.5.2 源程序,客户端程序主要由business包的Client.java和window包的ClientFrame.java两个文件组成。,17.5.3 程序解释,下面对上
11、述源程序中的关键实现部分给予重点说明。 (1)程序入口为Client类的main()方法。main()方法创建了Client类的实体。客户端界面的生成和通信程序的启动都是在Client类的构造方法中完成。 (2)Client类的构造方法中首先创建了图形界面ClientFrame类的实体,并将其设置为可见。客户端图形界面的主要实现类为window.ClientFrame。其中,ClientFrame类提供了一个public方法display()。客户端业务程序Client类可以调用该方法在图形界面的上半部的文本区域内显示相关文字信息。 (3)显示完图形界面后,Client类的构造方法调用star
12、tClient()方法启动通信程序。startClient()方法实现了请求连接、与服务器端通信的主要核心业务,所以它也是客户端程序的实现重点。,17.5.3 程序解释,(4)startClient()方法首先创建了Socket类的实例,用于请求指定服务器及指定端口的连接。在图形界面上会显示连接建立情况的信息。 (5)与服务器端成功建立连接后,即可以向服务器发送消息进行通信。发送消息的操作方法为在图形界面左下角的文本域内输入相应文本。然后单击“发送”按钮,服务器端图形界面上即会显示客户端发来的消息内容。 (6)上述循环退出的条件为收到标识为退出连接的消息。触发退出连接行为的动作可能为服务器端输
13、入退出标识信息、服务器端直接关闭了连接等。这些动作都会为客户端程序自动发送退出连接的消息。 客户端程序接收到退出连接的消息后,退出无限循环,结束当前客户端的连接,并在图形界面上显示相关信息。结束当前连接后,程序关闭相应的输入、输出流,完成本次与服务器端的通信。,17.6 小 结,本章实例是针对第14章Java网络编程知识给出的一个较完整的综合实例。该实例实现了一个简单的局域网通信软件,所涉及的知识点包括Java网络编程相关知识及Java图形界面。其中,读者要重点掌握的是Java网络编程知识的具体应用。灵活使用Java语言的网络编程知识,开发出更加复杂、强大的应用系统。第18章将介绍Java语言Web编程实例。,