首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事
您的当前位置:首页正文

Java聊天系统的开发和研究

来源:画鸵萌宠网
毕业设计(论文)

Java聊天系统的开发和研究

摘要

随着计算机网络技术的快速发展,人们的交流方式越来越多,传统的通信方式在速度和可靠性方面已经很难满足人们的需要,即时通信系统已成为人们的新宠。同时,即时通信系统对现代企业也有着重大意义,它为诸企业开拓了网络应用的新领域。自从它诞生以来,以实时交互、资费低廉等优点,受到广大个人用户的喜爱,已经成为网络生活中不可或缺的一部分。本着学以致用的原则,本人开发了这套多点聊天系统,以满足网络用户的通讯需求。该系统具有操作简单、界面友好、功能专一等特点。本论文就系统的开发过程做了详细的介绍,并对系统的原理、总体设计等方面做了深入细致的讨论。

关键词:聊天系统;网络通信;网络编程

Abstract

Along with the rapid development of computer network technology, the ways of people’s communication are increased rapidly. The traditional means of communication has becomevery difficult to meet people's needs in speed and reliability. Instant

communication system has become the new darlings of the people. Meanwhile, Instant communication system is also of great importance to the modern enterprises. It exploits a new domain for the enterprise. It has been enjoyed by the majority of individual users for its real-time interaction between the advantages of low rates since its bored. It has been an integral part of network life. In apply of the principle of practice, I developed the set of multi-point chatting system to meet the network users' needs of communication. This system has some characteristic as follows : simplify operation, friendly interface, single function. This paper introduced the process of the system's exploitment in detail, and deeply discussed the principle of system、collectivity design.

Keywords: Chatting system; Network communications; Network programming

目 录

1.绪论 ............................................................................................................................................................. 5 2.系统需求分析 ............................................................................................................................................ 6 2.1.功能需求 .............................................................................................................................................. 6 2.2.可靠性需求 .......................................................................................................................................... 6 3.系统可行性分析 ........................................................................................................................................ 8 3.1.技术可行性 .......................................................................................................................................... 8 3.2.经济可行性 .......................................................................................................................................... 9 3.3.操作可行性 .......................................................................................................................................... 9 4.多点聊天通信原理 ................................................................................................................................... 11 4.1.套接字通信 ......................................................................................................................................... 11

4.1.1 客户端套接字 .............................................................................................................................12 4.1.2 服务器端套接字 .........................................................................................................................13 4.2 数据报通信 ........................................................................................................................................14 4.3 无连接的客户/服务器程序工作流程 ...............................................................................................16 4.4 多线程编程 ........................................................................................................................................17 5.总体设计 ...................................................................................................................................................19 5.1 系统通信模型与拓扑结构设计 ........................................................................................................19 5.1.1 即时通讯系统的一般模型 .........................................................................................................19 5.1.2 即时通讯系统服务的拓扑模型 .................................................................................................20 5.2 功能设计 .........................................................................................................................................20 5.2.1 服务器端功能设计 .....................................................................................................................20 5.2.2 客户端功能设计 .........................................................................................................................21 5.3 界面设计 .........................................................................................................................................22 5.3.1 服务器端界面设计 .....................................................................................................................22 5.3.2 客户器端界面设计 .....................................................................................................................23 6.详细设计 ...................................................................................................................................................25 6.1 服务器端详细设计 ............................................................................................................................25 6.1.1 界面设计 .....................................................................................................................................25 6.1.2 功能模块的实现 .........................................................................................................................25 6.2 客户端详细设计 ................................................................................................................................26 6.2.1 界面设计 .....................................................................................................................................26 6.2.2 功能模块的实现 .........................................................................................................................27 结论 ...............................................................................................................................................................28 致谢 ...............................................................................................................................................................29 参考文献 .......................................................................................................................................................30

1.绪论

随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式已经难以满足人们的交流的需求了,在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。同时,即时通信系统对现代企业也有着重大意义,它能实现快速人际交流、数据共享,从而提高效率和生产力。实时通信为诸企业开拓了网络应用的新领域。自从它诞生以来,以实时交互、资费低廉等优点,受到广大个人用户的喜爱,已经成为网络生活中不可或缺的一部分。越来越多的企业已开始认识到即时通信工具能够带来极高的生产力,借助它的应用,来提高业务协同性及反馈的敏感度和快捷度。因此,两台计算机之间进行即时通讯、发送文件等交流方式已经成为必然潮流。因此出现了QQ、UC 等聊天工具,然而QQ、UC 等聊天工具虽然方便、实用,但是,娱乐功能太多,有很多吸引人的娱乐功能,从一定程度上来说,是一种娱乐工具,不能作为用于即时通讯的专用工具。目前,用于实现单一的即时通讯的软件实在太少,为此,我们决定开发一个专用于实现多台计算机之间即时通讯的软件,以方便多台计算机之间信息的快速交流。本系统基于C/S 模式实现,采用Java 语言编写。所有用户都通过服务器端中转消息,这也是现有大多数聊天系统所采用的模式。本系统真正地实现了多点聊天的功能,可以在多点间快速传递信息。同时,它体积小,功能单一,界面简洁美观,容易上手,只要简单阅读服务器端和客户端的帮助文档即可完全掌握它的使用方法。是网络聊天,特别是局域网聊天不可多得的好帮手。

2.系统需求分析

对软件需求的深入理解是软件工作者获得成功的前提条件,只有真正满足用户需求的软件才是有用的软件。系统需求分析将要回答的问题是:用户需要什么样的系统,系统必须做些什么等问题。只有锁定目标,才能更有效率,更正确的工作。

2.1.功能需求

聊天室软件共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登陆到服务器才可以实现正常聊天功能。

1)服务器端的主要功能如下

·在特定的端口上进行侦听,等待客户段连接 ·用户可以配制服务器的侦听端口,默认端口为8888 ·向已经连接到服务端的用户发送系统消息 ·统计在线人数

·当停止服务时,断开所有用户连接 2)客户端的主要功能如下

·连接到已经开启聊天服务的服务端

·用户可以配制要连接服务器端的IP 地址与端口号 ·用户可以配制连接后显示的用户名

·当服务器端开启后,用户可以随时登陆和取消 ·用户可以向所有人或者某一个人发送消息

2.2.可靠性需求

多点聊天系统是一个应用软件,要传送的数据必须通过传输层来完成。在传输层有两个传输协议可以使用,就是UDP 协议和TCP 协议。UDP 协议是无连接的传输协议,也没有保证可靠传输的措施,就是说它不能保证传输质量。而TCP 协议是面向连接的协议,通过对传输数据的每一个字节统一编号、接收端确认、发送端超时重传、流量控制、拥塞控制等措施来保证所传输数据的可靠性。要保证多点聊天系

统的通信可靠性,必须选择可靠的传输协议。

本系统设计时选择了TCP 协议作为传输协议。TCP 协议在一个应用程序向另一个应用程序发送数据之前,两个进程之间必须经过三次“握手”,为后续的数据可靠传输发送一些预备数据段。TCP“连接”也不像线路交换网络中的端到端的TDM 或者FDM 电路,它不是一个虚电路,连接状态完全驻留在两个终端系统中。同时,TCP 协议通过错误检测、设置计时器、在数据段头部设置顺序号和确认号字段等机制来保证TCP 数据段正确、完整、有序的传输到接收方。

3.系统可行性分析

本章从技术、经济和操作三个方面对系统的可行性做出了分析。确定了系统是否值得实现。可行性分析是现代软件工程不可或缺的重要组成部分。对问题的可行性做详细认真的可行性研究,可以避免很多不必要的浪费,确保用最小的代价在尽可能短的时间内确定问题是否能够解决。

3.1.技术可行性

经过对系统需求的认真分析,综合各种计算机高级语言的特性和适应范围,最终决

定选择纯面向对象的Java 语言来完成我的毕业设计,Java 是Sun Microsystem 公司的James Gosling 开发的编程语言。Sun 公司的口号就是\"网络就是计算机\能使所有东西从桌面计算平稳的转变为基于网络的计算,它是专门为此而建立的,并显然是为了完成这个任务而来的。使用Java,我们可以相对轻松的编写一个有条理的网络程序。下面就技术可行性方面,对Java 语言作一简要介绍。Java 是一种简单的、面向对象的、健壮的、安全的、解释的、与平台无关的、多线程、动态的计算机语言。Java 的开发环境有不同的版本,Sun 公司相继的推出了J2ME、J2SE、J2EE 三大平台,尤其是J2SE 是Java 2 标准平台,广泛用于工作站、PC 机,被称为“互联网上的世界语”。这些为我们开发系统提供了强大的平台支持。而且Java 在互联网方面具有得天独厚的优势,也是最吸引我们的地方之一。

Java 最初是为家用电器进行集成控制而设计的一种语言,因此它必须简单明了。Java 摒弃了C++中容易引发程序错误的一些特性,如指针、结构以及内存管理等。Java提供了丰富的库类,可以帮助我们很方便的开发Java 程序。Java 致力于检查程序在编译和运行时的错误。Java 也是一种强类型的语言,其类型检查比C++还要严格,类型检查帮助我们检查出许多开发早期出现的错误。Java 自己负责内存管理,提供了垃圾回收机制,有效的避免了C++中最头疼的内存泄露问题。Java 的安全性可以从两个方面得到保证。一方面,在Java 语言里删除了指针和释放内存等C++功能,避免了非法内存操作;另一方面,通过Java 的安全体系架构来确保Java 代

码的安全性。Java 作为一种网络语言,其源代码被编译成一种结构中立的中间文件格式。只要有Java 运行系统的机器都能执行这种中间代码。Java 源程序被编译成一种与机器无关的字节码格式,在Java 虚拟机上运行。Java 语言的一个重要的特性就是在语言级别支持多线程的程序设计,使得在编写多线程程序时十分的简单。JVM 很好的管理多个线程同时运行过程中了资源共享问题。Java 的动态性是其面向对象设计方法的扩展。它允许程序动态地装入运行过程中所需要的类。Java 编译器不是将对实例变量和成员函数的引用编译为数值引用,而是将符号引用信息在字节码中保存下来,传递给解释器,再由解释器在完成动态连接类后,将符号引用信息转换为数值偏移量。这样,对类中的变量和方法进行更新时就不至于影响存的代码。

3.2.经济可行性

在Java 诞生之初,Sun 及其明智的制定了一个开放的发展策略,为Java 的发展创造了一个良好的环境,可以说正是这个策略造就今天繁荣兴旺的局面,也因此Java 与开源结下了不解之缘。Java 世界中,开源组织与非盈利机构发挥到了极致,许多出色的工具都出自它们之手。比如JUnit、Cactus、Tomcat、Struts、JBoss、Eclipse、ANT、Xerces、Hibernate、Axis、AspectJ 等等,许多工具还会出现在我们的咖啡馆中,扮演重要的角色。Java 世界中,便宜无好货绝对不成立,这些工具拥有足以和商业软件媲美的质量,很多商业IDE 还集成了这些工具。“开源,不仅仅是Java 语言,还包括开发工具和框架,相对廉价的开发成本”。这就使得个人使用Java 作为开发平台成为可能。

3.3.操作可行性

与C、C++、Visual Basic、Delphi 等计算机语言不同,Java 技术特指应用,而不是Java 语言。Java 技术广泛应用于各种设备,为你提供各种工具、信息以及好玩的游戏。Java 为我们提供了可视化的图形API,基于此我们就能开发良好的GUI,为用户提供方便的操作环境。同时,Java 丰富的类库资源,使得我们在设计的时候可以通过简单的继承就可以实现许多复杂的功能。Java 优越的可移植性大大提高的软件的可重用性,用Java 开发的软件,可以不经过任何的更改就移植到支持Java 虚

拟机的操作系统上,真正的实现了“一次编译,到处运行”。

4.多点聊天通信原理

本章是整个系统实现的理论部分,将介绍多点聊天系统实现的基本原理,对套接字、数据报通信和多线程等相关技术进行了讨论。

4.1.套接字通信

套接字(Socket)是网络通信的基本操作单元,又称作端口,通常用来实现客户方和服务方的连接。网络上的两个程序通过一个双向的通信连接实现数据的交换,在实现双向通信前链路的每一端都建立一个Socket,通过对Socket 的读/写操作实现网络的通信功能。套接字是网络通信的一个标准,它就像房中的电源插座,无论是电灯还是电脑等电器,它们只要使用220V 50HZ 的交流电压,插在电源插座上能正常工作。

套接字分为以下3 种类型: (1) 流套接字

这是最常用的套接字类型,TCP/IP 协议簇中的TCP 协议使用此类接口,它提供面向连接的(建立虚电路)、无差错的、发送先后顺序一致的、包长度不限和非重复的网络信包传输。

(2) 数据报套接字

TCP/IP 协议簇中的UDP 协议使用此类接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度为32KB,传输不保证顺序性、可靠性和无重复性,它通常用于单个报文传输或可靠性不重要的场合。

(3) 原始数据报套接字

提供对网络下层通信协议的直接访问,它一般不是提供给普通用户的,主要用于开发新的协议和提取协议较隐蔽的功能。所有Socket 通信程序的基本结构都是一样的,主要有创建Socket、打开连接到Socket 的输入流和输出流、按照一定的协议对Socket 进行读写操作、关闭Socket 这四个步骤,通过这四个步骤可以完成一般的Socket 通信。为了完成Socket 通信,java.net包中提供了Socket 和

ServerSocket 这两个类,它们分别用来表示双向连接的客户端和服务端,它们的构

造函数如下:

Socket(InetAddress address,int port)

Socket(InetAddress address,int port,Boolean stream) Socket(String host,int port)

Socket(String host,int port,Boolean stream) ServerSocket(int port)

ServerSocket(int port,int count)

其中,address 代表双向连接另一方的IP 地址,host 为主机名,port 为端口号,stream 用来指定是流套接字还是数据报套接字,count 表示服务器能够支持的最大连接数。这里涉及到一个端口号分配的问题,TCP/IP 将端口号分为两部分,少量的作为保留端口,端口号小于256,以全局方式分配给服务进程。因此每一个标准服务器都拥有一个全局公认的端口号,即使在不同的机器上其端口号也相同。对于常见的保留端口号主要有:80 端口提供WWW 服务、23 端口提供telnet 服务、21 端口提供FTP 服务、110 端口为POP 服务等。剩余的为自由端口号,比如TCP 协议可以有123 端口,UDP 协议也可以有123 端口,这并不冲突,因为不同的协议有完全独立的软件模块。但是作为唯一通信连接的套接字之间是不能重复的。作为服务器的应用程序只能同时绑定一个端口号,但是,一个服务器程序在同一端口上可以响应若干客户端请求,由于不同的客户端对应于不同的主机地址和端口号,所以这仍然具有套接字的唯一性。

4.1.1 客户端套接字

客户端/服务器是一种网络服务模式。在该模式中,客户机和服务器之间需要定义一套通信协议,并创建一个Socket 类,利用这个类来建立一条可靠的链接;然后,客户端/服务器再在这条连接上可靠地传输数据。客户端发出请求,服务器监听来自客户机的请求,并为客户端提供响应服务。利用Socket 类,我们可以轻松地实现网络客户端程序的编写,Socket 类的一些常用的方法汇总如下:

getLocalAddress() 读取套接字对象的本地地址 getLocalPort() 读取套接字所使用的本地端口号

getInputStream() 得到一个输入流 getOutputStream() 得到一个输出流

通常情况下,客户端只要能够顺序处理服务器程序的响应就可以了,因此客户端程

序通常不使用多线程。

4.1.2 服务器端套接字

实现套接字的服务端,需要使用ServerSocket 类。ServerSocket 类是服务器程序的运行基础,它允许程序绑定一个端口号来监听客户端的请求,一旦产生客户端请求,它将接受这一请求,同时产生一个完整的Socket 连接对象。服务器绑定的端口必须公开,以便让客户端程序知道如何连接这个服务器。同时,作为服务器,它必须能够接收多个客户的请求,这就需要为服务器设置一个请求队列,如果服务器不能马上响应客户端的请求,要将这个请求放进请求队列中,等服务器将当前的请求处理完,会自动到请求队列中按照先后顺序取出请求进行处理。服务器的资源是有限的,这就导致它的最大连接数是有限的,通过ServerSocket 的构造函数可以指定这个最大连接数。如果不明徐州工程学院毕业设计(论文)确指定这个连接数,默认最大连接数为50,也就是说,客户端的请求队列最大可以容纳50 个请求,当超过这个最大连接数时,用户的请求将不再会被响应。利用SocketServer 也提供了一些方法,它们主要有:

accept() 返回一个“已连接”的Socket 对象 getInetAddress() 得到该服务器的IP 地址 getLocalPort() 得到服务器所侦听的端口号 setSoTimeout() 设置服务器超时时间 getSoTimeout() 得到服务器超时时间

由于存在单个服务程序与多个客户程序通信的可能,所以服务程序要响应客户程序

不应该花很多时间,否则客户程序在得到服务前有可能花很多时间来等待通信的建立,然而服务器程序和客户程序的会话可能很长,因此,为加快对客户程序连

接请求的响应,典型的方法是服务器主机运行一个后台线程,这个后台线程处理服务器和客户端程序的通信。这一点和客户端的程序设计是不同的。

4.2 数据报通信

现代网络通信主要基于TCP/IP 和UDP 协议。它们都是建立在更底层的IP 协议之上的两种通信传输协议。前者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路。进行连续的、双向的、严格保证数据正确性的传输协议;后者已数据报形式,对拆分后的数据的先后顺序不做要求的文件传输协议。虽然TCP 协议提供了有序的、可预测和可靠的信息包数据流,但是这样做的代价也很大。TCP 包含很多在拥挤的网络中处理拥塞控制的复杂算法以及信息丢失的预测,这导致了这样传输数据的方式效率很差。因此,数据报通信方式是一种可选的替代方法。多点聊天系统是以UDP 协议进行发送和接受消息的,采用C/S 模型实现,使之更适合局域网的网络程序。C/S 模型主要由客户应用程序、服务器控制程序两部分组成。在网络上传输的信息,不仅限于聊天信息,还有各种控制信息,用以标识发送者用户名、IP 地址和接收者用户名、IP 地址等信息。利用数据报传送,但受其长度限制,通常必须将数据分解为多个包,在目的地再重新组合,而这一切在传输过程中会出现大量的问题。Socket 对象封装了这一切,让程序员可以将网络连接视为另一种可以读取字节的流。数据报通信协议UDP 是一种非面向连接的提供不可靠的数据包式的数据传输协议,类似于从邮局发送信件的过程,信件只要放到邮箱就算完成任务。这说明了一旦数据报被释放给它们预定的目标,不保证它们一定达到目的地,甚至不保证一定存在数据的接受者。同样,数据报被接收时,不保证它在传输过程不受损坏,不保证发送它的机器仍在等待响应。此外,数据报传输有大小限制,每个传输的数据报必须保证在64KB 之内。

Java 通过 DatagramPacket 和DatagramSocket 两个类来实现UDP 协议顶层的数据报。DatagramPacket 生成的对象表示一个数据报,而DatagramSocket 是用来发送和接受数据包的类。生成DatagramPacket 对象可以用下面四个构造函数:

DatagramPacket(byte data[],int size)

DatagramPacket(byte data[],int offset, int size)

DatagramPacket(byte data[],int size, InetAddress ipAddress,int port) DatagramPacket(byte data[],int offset, int size, InetAddress ipAddress,int port)

第一个构造函数指定了接受数据的缓冲区和信息包的容量大小。它通过DatagramSocket 接收数据。第二种形式允许你在存储数据的缓冲区中指定一个偏移量。第三种形式指定一个于DatagramSocket 决定信息包将被送往何处的目标地址和端口。其中InetAddress 类为表示IP 地址的类。第四种形式从数据中指定的偏移量位置开始传输数据包。对于DatagramPacket 的内部状态,可以用如下方法获得。这些方法对数据包的目标地址和端口号以及原始数据和数据长度有完全的使用权,下面列举出这些方法:InetAddress getAddress() 返回目标文件InetAddress,一般用于发送int getPort() 返回端口号byte[] getData() 返回包含在数据包中的字节数据。多用于在接收数据之后从数据包来检索数据int getLength() 返回包含在将从getData()方法返回的字节数组的有效数据长度。通常它与整个字节数组长度不等。前面说过,DatagramSocket 类用来发送和接收数据包。因此,在用数据报方式编写客户端/ 服务器端程序时, 无论是在客户端和是服务器端, 首先需要建立DatagramSocket 对象,用来接收和发送数据报,然后使用DatagramPacket 类对象作为传输数据的载体。DatagramSocket 类常用的构造函数如下:

DatagramSocket() DatagramSocket(int port)

DatagramSocket(int port,InetAddress ipAddress)

通常,DatagramSocket 接受数据报要用receive(DatagramPacket p)方法,而发送数据报则使用send(DatagramPacket p)方法,这两个方法是DatagramPacket 十分常见的方法。要发送一个数据报,首先创建一个DatagramPacket,指定要发送的数据、数据的长度、数据要发送至哪个主机及该主机的哪个端口,然后再用DatagramSocket 的send()方法发送数据包;要接收一个数据报,首先必须创建一个在本地主机的特定端口上侦听的DatagramSocket,此套接字只能接受发送至特定端口上的数据包。在Windos 操作系统中,已经为网络通信提供了Winsock.dll 动态链接库,即API 函数。通过Socket,可以调用这些API 函数,从而实现网络通信。寻呼

系统在通信时可以使用UDP 协议,也可以使用TCP 协议,本章将分别介绍利用UDP 协议和TCP 协议的通信原理。

4.3 无连接的客户/服务器程序工作流程

在Windos 操作系统中,已经为网络通信提供了Winsock.dll 动态链接库,即API 函数。通过Socket,可以调用这些API 函数,从而实现网络通信。多鼎足之势聊天系统在通信时使用UDP 协议。下面简单介绍利用UDP 协议的通信流程。无连接的客户/服务器工作模式使用UDP 协议进行数据传输。UDP 协议是英文UserDatagram Protocol 的缩写,即用户数据报协议,双方通信之前不需要建立连接。主要用来支持那些需要在计算机之间快速传输数据的网络应用,如各类网络管理和网络控制数据都是利用UDP 协议传送,那些需要一对多或广播通信的应用更是UDP 的用武之地,

如网络视频会议就是利用UDP 协议传送的。UDP 协议直接位于IP(网际协议)协议的顶层,该协议的主要作用是将网络数据流压缩成数据报的形式并交网络层发送出去。UDP协议自问世至今,始终是一个经济、实用的网络传输层协议,使用UDP 协议的客户/服务器工作模型如图3.1 所示。

图4.1 无连接的客户/服务器工作模型

要通过互联网进行通信,系统至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。

Client1 通过与SocketServer 通讯,可得知其IP 地址Client1IP,Client2 也通过与SocketServer 通讯,也可得知其IP 地址Client2IP。两个IP 地址可存放地址列表里。每个Client 建立两个UDP 和利用两个端口,一个用来发送数据给另一个Client,一个用来接收从另一个Client 的数据。SocketServer 将Client2IP 发给Client1,这样Client1 用SendUDP 向Client2IP 发送数据,Client2 用recievedUDP 接收数据。反之,也行。

4.4 多线程编程

Java 支持内置多线程编程。多线程程序包括两条或两条以上并发运行的部分。程序中每个这样的部分都叫一个线程,每个线程都是独立的执行路径。因此,多线程是多任务处理的一种特殊形式。多任务处理有两种截然不同的类型:基于进程的和基于线程的。进程本质上一个正在执行的程序。因此,基于进程的多任务处理的特点是允许你的计算机同时运行两个或更多的程序。举例来说,基于进程的读任务处理使你在运行文本编辑器的时候可以同时运行Java 编译器。在基于进程的多任务处理中,程序是调度程序多分派的最小代码。也就是说,进程是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源。在基于线程的多任务处理环境中,线程是最小的执行单位。线程是进程中的一个单一的连续控制流程。一个进程可以拥有多个线程。这意味着一个程序可以同时执行两个或多个任务的功能。例如,一个文本编辑器可以在打印的同时格式化文本。所以,多进程程序处理大局问题,而多线程程序处理细节问题。多线程程序比多进程程序需要更少的管理开销。进程是重量级的任务,需要分配它们自己独立的地址空间。进程间通信是昂贵和受限的。进程间的转换也是很需要花费的。另一方面,线程是轻量级的选手,它和进程一样拥有独立的执行控制,由操作系统负责调度。区别在于线程没有独立的存储空间,而是和所属进程的其他线程共享一个存储空间,因此,线程间通信是容易的,线程间的转换也是低开销的。当Java 程序使用多进程的任务处理环境时,多进程的程序不受Java 的控制,而多线程则受控于Java。

多线程可以帮会你写出CPU 最大利用率的高效程序,因为空闲时间保持最低。这对Java 运行的交互式的网络互联环境至关重要,因为空闲时间是公共的,举个例

子来说,网络的数据处理传输速率远低于计算机处理能力,本地文件系统资源的读写速度远低于CPU 的处理能力,当然,用户输入也比计算机慢的多。在传统的单线程环境中,你的程序必须等待每一个这样的任务完成以后才能执行下一步—尽管CPU 有很多空闲时间。多线程是你能够获得并充分利用这些空闲时间。

·多线程编程简单,效率高(能直接共享数据和资源,而多进程却不能) ·适合于开发多种交互接口的程序

·减轻编写交互频繁,涉及面多的程序的困难

在本系统中,设置后台线程处理服务器和客户程序的通信。服务器资源以轻量级的线程提供,和多个客户线程并发连接通信。这样可以减轻服务器端的开销,同时保证了多个用户端连接能够得到快速而高效的服务。

5.总体设计

总体设计是回答“概括地说,系统应该如何实现?”这个问题。它要完成的主要任务是划分出组成系统的物理元素,设计软件结构,也就是确定系统中每个程序是由哪些模块组成,以及各个模块之间的关系。

5.1 系统通信模型与拓扑结构设计 5.1.1 即时通讯系统的一般模型

即时通讯服务有两个实体:发送者和接受者。即时通讯协议定义了即时通讯服务、发信者和接受者之间的交互作用。即时通讯服务与其他邮件服务不同之处在于,即时消息本身足够的小,便于快速交付到接受者。个体,用户代理,即时通讯系统的模型用图5-1 表示

图5-1 即时通信系统的一般模型

该模型显示了通信系统服务器端和客户端之间的联系。首先配制并启动服务器端,进行端口的侦听。当有用户登陆时,在文本区能显示用户XXX 上线,并将在线总人数通知其他客户端。当客户端1 向客户端2 发送信息时,信息首先发送给服务器端,通过服务器的中转,再传递给客户端2。系统支持多点聊天,一个客户端可以通过群聊的方式向所有其他的客户端发送信息。

5.1.2 即时通讯系统服务的拓扑模型

如图5-2,现在不少即时通讯系统服务的内部拓扑中采用模式一;也有极其个别系统在即时通讯服务上面采用模式二(例如,深圳腾讯的QQ 服务中的即时通讯服务,发信者首先考虑直接与即时收信箱进行通讯,如果发现直接通讯超时,会转为使用服务器中转完成通讯)。模式一是一种非常成熟的模式,大多数TCP/IP 应用系统,例如SMTP 服务、DNS 服务、WWW 服务等都是使用这种模式。模式二,对于模式一是一个技术上的修正,虽然这个修正带来了新的问题,但是其实用性是不可质疑的。本系统主要采用模式二的变体结构,由一个主服务器承担消息的接受和转发工作,同时监听用户上下线信息,以便通过其他已登陆用户。

5.2 功能设计 5.2.1 服务器端功能设计

聊天室服务器端主要包括7 个文件,它们应该实现下列功能:

(1)ChatServer.java

包含名为ChatServer 的public 类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。调用ServerListen 类来实现服务器端用户上下现的侦听,调用ServerReceive 类来实现服务器端的消息收发。

(2) ServerListen.java

该类实现服务端用户上线和下线的侦听。该类对用户上线下线的侦听是通过调用用户链表类(UserLinkList)来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。

(3) ServerReceive.java

该类是实现服务器消息收发的类。该类分分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。

(4) PortConf.java

该类继承自Jdialog,是用户对服务器端侦听端口进行修改配制的类。 (5) Node.java

用户链表的节点类,定义了链表中的用户。该类与前面所讲的链表节点Node 类的功能相当。

(6) UerLinkList.java

用户链表节点的具体实现类。该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5 个方法。

(7) Help.java 服务端程序的帮助类。

5.2.2 客户端功能设计

聊天室客户端主要包括5 个文件,它们应该实现下列功能: (1) ChatClient.java

包含名为ChatClient 的public 类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。该类定义了Connect()与DisConnect()方法实现与服务器的连接与断开连接。当登到指定的服务器时,调用ClientReceive 类实现消息收发,同时

该类还定义了SendMessage()方法来向其他用户发送带有表情的消息或者悄悄话。

(2) ClientReceive.java

该类是实现服务器端和客户端消息收发的类。 (3) ConnectConf.java

该类继承自Jdialog,是用户对所要连接的服务器IP 及侦听端口进行修改配制的类。

(4) UserConf.java

该类继承自Jdialong,是用户对连接到服务器时所显示的用户名进行修改配制的类。

(5) Help.java 客户端程序的帮助。

5.3 界面设计 5.3.1 服务器端界面设计

图5-3 服务器端主界面

图5-3 是服务器端主界面。窗体框架的长和宽被设定为固定值,窗体初始化时居中显示。框架整体采用边界型布局格式, 工具栏添加到面板的NORTH 处,

messageScrollPane 组件添加到面板的CENTER 处, downPanel 组件添加到面板的SOUTH 处。其中downPanel 采用表格包型布局,依次添加none、发送至、用户comobox/ 发送信息、sysMessage、发送按钮、showStatus 标签。

图5-4 端口设置界面

图5-4 是端口设置界面。启动时的初始位置为主窗体的(50,150)像素处。继承自JDialog 类,采用边界型布局格式,panelPort 组件添加到面板的NORTH 处,DIGINFO组件添加到面板的CENTER 处,panelSave 组件添加到面板的SOUTH 处。 5.3.2 客户器端界面设计

图5-5 客户端主界面

图5-5 是客户端主界面。窗体框架的长和宽被设定为固定值,窗体初始化时居中显示。框架整体采用边界型布局格式,工具栏添加到面板的NORTH 处,

messageScrollPane组件添加到面板的CENTER 处, downPanel 组件添加到面板的SOUTH 处。其中downPanel 采用表格包型布局,依次添加none、发送至、用户comobox、表情、表情comobox、动作list、checkbox / 发送信息、clientMessage、发送按钮、showStatus 标签.

图5-6 连接设置界面

图5-6 是连接设置界面。启动时的初始位置为主窗体的(50,150)像素处。继承自JDialog 类, 采用边界型布局格式, panelUserConf 组件添加到面板的NORTH处,DIGINFO 组件添加到面板的CENTER 处,panelSave 组件添加到面板的SOUTH 处。

6.详细设计

本章将对服务器与客户端的界面设计、每个功能模块的实现方法、实现过程及相应代码设计进行详细介绍。

6.1 服务器端详细设计 6.1.1 界面设计

首先,调用Dimension()函数精确地设置框架大小,在服务器端构造函数中调用程序的初始化函数,生成服务器端界面。在Java 中,组件放置在窗体的方式通常不是通过绝对坐标控制,而是由“布局管理器”(layout manager)根据组件加入的顺序决定其位置。每个容器都有一个属于自己的布局管理器。使用不同的布局管理器,组件的大小、形状和位置将大不相同。本系统界面设计时整体采用边界型布局格式,使用了其中的三个位置:NORTH、CENTR 和SOUTH,分别用于放置toolBar、messageScrollPane 和downPanel三个部分

6.1.2 功能模块的实现

主要是实现各种按钮和菜单项的侦听和响应,设置快捷键等工作。在服务器端构造函数中用setMnemonic()和setAccelerator()方法设置菜单项和按钮的快捷键,其中,功能相同的菜单项和按钮使用相同的快捷键( 具体实现请参照附录一: 源程序的

ChatServr.java 文件)。在程序化初始化函数init()中,用addActionListener()方法为各组件添加事件侦听。事件响应部分则在actionPerformed()函数中用if-else 选择结构来实现,这个部分是GUI程序设计的核心部分。当事件被触发时,系统就会调用这个函数,利用if-else 结构的特性,从上到下依次判断。当找到符合条件的if 语句后,就执行其后大括号内相关的内容。

如没有满足的条件,程序可以采取忽略或者调用系统默认函数进行处理。本程序的主要事件包括:startServer(或 startItem)启动服务端、stopServer(或 stopItem)停止服务端、portSet(或 portItem)端口设置、exitButton(或 exitItem)

退出程序、helpItem 菜单栏中的帮助和sysMessage(或 sysMessageButton)发送系统信息六个事件。当用户选择“启动服务”或单击“启动服务”按钮时,启动服务端事件被触发,系统就会调用startService()函数。这个函数主要完成生成服务器端ServerSocket 对象,设置startServer、 portSet、 portItem 为不可用状态,stopServer、sysMessage 为可用状态,调用ServerListen 函数启动一个后台侦听线程,侦听客户端上下线信息。当用户选择“停止服务”或单击“停止服务”按钮时,停止服务端事件被触发。系统调用showConfirmDialog()函数生成一确认对话框,当用户再一次确认停止时,stopSerice()函数就会被调用。这个函数首先向所有人发送服务器关闭的消息,然后清理用户列表,将stopServer、sysMessage 设置为不可用状态,tartServer、 portSet、 portItem为可用状态。最后在文本区里显示“服务端已经关闭”的信息来告知使用者。当用户选择“端口配制”或单击“端口配制”按钮时,端口配制事件被触发。

系统调用PortConf()函数,生成一个端口设置对话框和用户交互。用户可以更改默认的侦听端口,然后点击“确定”按钮保存设置。当用户选择“退出”或单击“退出”按钮时,退出程序事件被触发。系统调用showConfirmDialog()函数生成确认对话框来征询用户意见,当得到再一次确认时,stopService()和exit()函数被调用,系统执行和“停止服务”一样的操作后,正确退出。当用户选择“帮助”菜单命令时,帮助事件被触发。系统调用helpDialog()函数,生成帮助对话框,向用户介绍系统使用的方法。用户可以借助帮助文件快速上手。当用户向文本框内输入信息,选择发送对象,点击确定按钮后,发送系统消息的事件被触发。系统调用SendSystemMessage()方法向接收对象发送信息。这个函数首先获得列表框的内容,确定接收者。根据接收者的不同,分别调用sendMsgToAll()和向某一特定用户发送信息。同时将发送消息框架的消息清空。

6.2 客户端详细设计 6.2.1 界面设计

客户端界面的设计在整体上和服务器端相似,只是在具体菜单项、工具栏按钮上稍有区别。downPanel 面板上也新增“表情”列表框和一个“悄悄话”选择框。

主要包括三个菜单组:“操作”(operateMenu)、“设置”(conMenu)、“帮助”(helpMenu)。其中,“操作”菜单组包括“用户登陆”(loginButton)、“用户注销”(logoffButton)、“退出”(exitButton)三个菜单项。“设置”菜单组包括“用户设置”(userButton)和“连接设置”(connectButton)两个菜单项。与之对应,工具栏部分包括5 个按钮,分别为:“用户设置”、“连接设置”、“登陆”、“注销”和“退出”

6.2.2 功能模块的实现

在ChatClient.java 文件里用setDefaultCloseOperation()函数添加事件处理,用来响应框架的关闭事件。用addActionListener()添加菜单项和工具按钮的事件处理,用来响“用户设置”、“连接设置”、“应用户登陆”、“用户注销”、“退出”和信息“发送”等事件的发生。当用户选择“用户设置”菜单项或点击“用户设置”按钮时,用户设置事件被触发,系统就会调用UserConf 构造函数,生成一个userConf 对象。这是一个对话框交互界面,如图6-10,系统默认的用户名(userName)“匆匆过客”被当作一个参数传递给构造函数。当用户完成用户信息修改后,通过userInputName 字段把用户名赋给userName 变量保存。

结论

本系统主要实现了多点聊天通信功能。它基于C/S 模式,以数据报通信为载体,借助套接字编程实现,具有外观简洁,使用简单等特点。系统支持群发功能,可以同时与所有其他用户实现信息的快速交流,为用户节省大量的时间。同时,各客户端又存有完整的用户链表信息,使用者可以选择悄悄话方式同特定的用户进行通信,很好的实现了信息的保密。本系统特别适合局域网用户之间的通信。

当然,由于本人能力有限,设计之初有很多好的想法没有实现。比如服务器端必须先告知各客户端其所在主机的ip 地址和通信端口,这样做很麻烦。本来想在服务器端启动服务程序中添加一段用于在本局域网范围内发送广播信息的功能段,信息包含服务器ip 地址和通信端口,通知各客户端软件自动完成服务器端的ip 和端口的配制工作。在编码实现的时候发现问题很难解决,最后不得不放弃。

致谢

首先感谢我的指导老师,他的认真务实的工作态度和和蔼可亲的待人方式是我所敬佩的。他严谨、认真,在我们的辅导过程中从未因个人的原因而推脱过。他耐心、细致,把我们需要的理论知识收集总结,又不耐其烦地一遍遍重复讲解。正是他认真负责的态度才使得我的设计工作能如期完成。其次我要感谢很多优秀图书的作者,正是他们的艰辛的劳动成果才使得我能够避开学习中的种种障碍,在最短的时间内达到目标。有时候当我陷入其中,迷惑不解时,往往就是他们的一句精辟的话使我顿悟,大有醍醐灌顶之式。感谢我周围的所有的人,轻松而又愉快的环境才能使人平静下来认真工作。最后,我要把我最真挚的感谢送给我的母校,四年的积累已经使懵懂幼稚的孩童历练成一个敢于直面生活的强者。尽管我知道由我们自己谱写的人生才刚刚开始,但有了大学四年的锻炼我不会再畏惧任何困难。再一次感谢我的母校!

参考文献

[1] 张一白 崔尚森 著.面向对象程序设计――Java.山西:西安电子科技大学出版社,2002

[2] W.Richaard Stevens.TCP/IP 详解卷1:范建华等译. 北京:机械工业出版社, 2000:1-10

[3] Andrew Stanenbaum1 计算机网络[M]第3 版 熊桂喜, 王小虎译. 北京:清华大学出版社, 1998

[4] (美)JamesF.Kurose Keith W.Rose.计算机网络.清华大学出版社,2003-1-1 [5] 张海藩 著.软件工程导论.北京:清华大学出版社,2003

[6] Beau Williamson.DevelopinglPMulticastNetworks.vol2ume[M].顾金星等译.北京:电子工业

出版社,2000

[7] 孙卫琴.基于MVC 的Java Web 设计与开发[M].北京:电子工业出版社,2004 [8] 龚正虎.现代TCP/IP 网络原理与技术.国防工业出版社,2002-9 [9] 张广彬 张永宝 等著.Java 课程设计案例精编. 北京:清华大学出版社,2006

[10]任泰明.TCP/IP 协议与网络编程.西安电子科技大学出版社,2004-4

因篇幅问题不能全部显示,请点此查看更多更全内容