基于 JAVA 的网络在线聊天工具 MINIQQ
1. Java 语 言 简介
1.1 什么是 JAVA 语言
Java 是 Sun 公司推出的新的一代面向对象程序设计语言,它是一种简单的、面向对象
的、分布式的、解释的、健壮的、安全的、结构中立的、可移植的语 言。特别适合于 Inte
rnet 应用程序开发,且正在不断发展和完善。
1.2 为什么选用 JAVA 语言进行开发
JAVA 具有易学好懂,开发时间短,开发的程序稳定性高等特点。针对我们要编写的网
络聊天程序,其也具有几个其他开发语言所不具备的优势:
1) 最大限度适于网络开发:JAVA 所带的开发包对包括使用 TCP/IP 等协议在内的各种
网络程序的开发提供全面的支持。
2) 平台无关性:基于 JAVA 编写的程序都具有很好的可移植性,能够在不同的计算机
系统上运行。
3) 对将要采用的 MVC、多线程等技术有着非常成熟的解决方案。
鉴于 JAVA 以上的特点,在开发网络相关软件的过程中,使用 JAVA 往往是最佳选择。
2. 使用 JAVA 实现网络聊天实现
2.1
NetBeans 开发环境
NetBeans 提供的一个完整、有效的 JAVA 编程环境,其提供一整套的基本构造类,能够
满足各种不同类型的程序开发要求,本文目的是在 NetBeans3.6 开发环境下,用 JAVA 实现
一个友好、高效、可扩充行高的局域网网络聊天程序。
2.2
QQ 精灵 1.0 简介
QQ 精灵 1.0 是使用 NetBeans3.6 开发,完全基于 JAVA,是一个具有完整功能的网络聊
天程序,。基于 JAVA 开发,使其除了拥有简单、友好的用户界面之外,还有着稳定的性能和
JAVA 固有的平台无关性,能够使用于各种操作系统。程序功能主要是仿照中国腾讯软件公
司出品的局域网聊天程序 BQQ,其采用传统的 C/S 模式(Client/Server,客户端/服务器模
式),由客户端与服务器两部分组成,能够进行网络间实时的聊天与文件传输,其同时具有
自动登录和进行在线用户统计等功能。
2.3
QQ 精灵 1.0 开发难点及解决方案
2.3.1 程序设计流程
程序开发过程采用了以下的实现流程:
1) 明确需求:仿照 BQQ 实现 C/S 模式的在线聊天程序。
2) 开发语言和环境的确立:使用 JAVA 语言,在 NetBeans3.6 环境下开发。
3) 协议的确立和信息格式的制定:确定功能实现使用的网络协议和内部信息传输格
式。同时决定使用的开发模式。
4) 程序架构设计:服务器和客户端分别实现,设计软件整体的层次和架构。
5) 程序设计:设计程序用到的类,明确各个线程的功能。
6) 具体开发实现。
以下就程序的设计实现过程中遇到了一些难点和解决办法做一下详细的介绍。
2.3.2 如何选择程序的系统体系结构
如何选择程序的网络程序的系统体系结构是在网络相关程序设计初期必须详细考虑的
问题。目前主要的网络程序实现的体系结构主要包括三种:C/S 模式(Client/Server,客
户端/服务器模式)、B/S 模式(Browser/Server,浏览器/服务器模式)、P2P 模式(peer-t
o-peer,端到端模式)其主要特点是:
1)
C/S 模式:主要由客户应用程序(Client)、服务器管理程序(Server)两个部件组
成。客户应用程序是系统中用户与数据进行交互的部件,服务器程序负责有效地
管理系统资源,其主要工作是当多个客户并发地请求服务器上的相同资源时,对
这些资源进行最优化管理。此模式的优点包括:应用交互性强、提供了更安全的
存取模式和可以降低网络通信量
2)
B/S 模式:主要由浏览器(Browser)、服务器管理程序(Server)两个部件组成。
它简化了客户端。它无需象 C/S 模式那样在不同的客户机上安装不同的客户应用
程序,而只需安装通用的浏览器软件,故具有更大的灵活性。当形势变化时,它
无须再为每一个现有的客户应用程序升级,而只需对 Web 服务器上的服务处理程
序进行修订。
3)
P2P 模式:P2P 网络是一种具有较高扩展性的分布式系统结构,其充分利用互联
网中众多终端节点所蕴涵的处理能力和潜在资源。相对于传统的集中式客户/服
务器(C/S)模型,P2P 弱化了服务器的概念,系统中的各个节点不再区分服务器和
客户端的角色关系,既可请求服务,也可提供服务。 P2P 系统最大的特点就是
用户之间直接共享资源,提高网络可扩展性。
以上三种模式是网络体系结构的主要分类,通过对三种主要类型的分析,我们采用了
C/S 模式来实现网络聊天程序,其特定更适合于局域网网络程序。
2.3.3 网络协议的选择和内部传送信息格式的定义
网络信息的传输可以采用 TCP 协议或者 UDP 协议。仅从应用角度来讲,我们可以理解
为 TCP 协议信息传输较为安全,但速度较慢,而 UDP 协议速度较快,但不保证对方一定能够
接收到信息,这里我们根据各自的特点,在文件传输时采用了 TCP 协议,保证文件传输的完
整性,而聊天信息的传输由于并不绝对需要保证完整,这里则采用了 UDP 协议,来保证其实
时聊天的速度,这也是各种网络程序协议选择的通用策略。
既然能够进行文件的传送,且 C/S 模式也要求必须传送一定的控制信息,故网络上面
传输的信息并不限于聊天信息,这也就要求程序能够区分各种信息。这里根据需求自定义了
网络传送信息的格式:
1)控制信息:Client to Server(客户端发给服务器的登录信息),由信息标识
“1” +“自身用户名” + “自身用户 IP 地址”组合而成
2)控制信息:Server to Client(服务器发给客户端的在线用户信息),由信息
标识“2” + + “在线用户名” + “在线用户 IP 地址”组合而成
3)聊天信息:Client to Client 客户端发给客户端的聊天内容信息,由信息标识
“3” + “对方用户名” + “对方用户 IP 地址” + “聊天内容”组合
而成
4)文件信息:Client to Client 客户端发给客户端的文件信息,文件内容组成
一条典型的聊天信息
3
新用户 1
192.168.1.11
你好!
信息标识
对方用户名
对方用户 IP 地址
聊天内容
图 1
上图是一条典型聊天信息的说明。如国所示,服务器和客户端可以各自根据以上信息
格式的定义判断接收到的信息,如服务器对登录信息进行分析来更新自己的在线用户列表,
而对其余信息则不做处理。而客户端使用所有收到的在线用户信息来更新自身的在线用户列
表,与服务器保持同步,而对收到的聊天信息则经过分析后只处理发给自己的那部分。
2.3.4 MVC 模式的采用
MVC 模式是"Model-View-Controller"的缩写,中文翻译为"模式-视图-控制器"。MVC
应用程序总是由这三个部分组成。即把一个应用的输入、处理、输出流程按照 Model、Vi
ew、Controller 的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制
层。的实现。
MVC 模式是一个复杂的架构模式,视图(View)代表用户交互界面,模型接受视图请求
的数据,并返回最终的处理结果,控制(Controller)可以理解为从用户接收请求, 将模型与
视图匹配在一起,共同完成用户的请求。模型、视图与控制器的分离,使得一个模型可以具
有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些
数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化
通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。使用 MVC 模式
的程序,减少了代码的复制,即减少了代码的维护量,一旦模型发生改变,也易于维护。
同时,由于模型返回的数据不带任何显示格式,因而这些模型也可直接应用于接口的使用。
再次,由于一个应用被分离为三层,因此有时改变其中的一层就能满足应用的改变。一个
应用的业务流程或者业务规则的改变只需改动 MVC 的模型层,具有更好的可扩展性,最后,
它还有利于软件工程化管理。由于不同的层各司其职,每一层不同的应用具有某些相同的特
征,有利于通过工程化、工具化产生管理程序代码。下图是 QQ 精灵 1.0 聊天系统的实现结
构图,完全符合 MVC 模式。
图 2
Client
ClientModel
ClientModel1
控制整个程序的启动、停止
控制整个程序的功能
在线用户的模型
显示主窗体
在线用户的模型
MainView
ClientModel1
ClientModel1
在线用户的模型
ClientView1
ClientView1
ClientView1
在线用户窗体
在线用户窗体
在线用户窗体
2.3.5 如何进行在线用户的统计?
通过对信息的定义,服务器与客户端之间能够进行在线用户信息的交互具体过程如下:
1)当用户等登录时,会自动向服务器发送一条登录信息,服务器收到信息并将该
用户的信息加入到自身保存在线用户信息的集合中。
2)服务器每隔一段时间会将在线用户集合的所有在线用户信息发送给所有的在
线用户,在线用户根据接收到的信息维护自身的在线用户集合。
3)若接收到的在线用户信息无某个用户,说明其在前一段时间已经不在线,则将
其从在线用户集合中删除,并删除界面上代表该用户聊天功能按钮。
上图为程序中处理该服务的界面。通过以上机制,程序能够实现与 BQQ 聊天程序类似
的在线用户统计功能。
2.3.6 如何利用多线程
在网络相关程序中,不可避免的要为多个用户提供相同或不同的服务,使用多线程是
最好的解决方案。多线程编程的含义是可将程序任务分成几个并行的子任务。特别是在网络
编程中,很多功能是可以并发执行的。在本程序中,服务器和客户端都使用了多个线程,
比如在客户端,共有四个线程共同执行,完成各自的工作,
1)线程 1 将新用户添加到在线用户数组,或对其进行必要的 IP 地址更新。
2)线程 2 不间断的把自身信息发送给服务器,维持服务器上的在线信息。
3)线程 3 用来维护自身在线用户数组,并维护程序主界面。
4)线程 4 则用来侦听文件传输。
通过以上各个线程的协调工作,程序才能够正常稳定的运行。
2.4 QQ 精灵 1.0 设计及使用中的一些注意事项
以下是 QQ 精灵 1.0 设计及使用时的几点考虑:
1)
该程序设计用来实现局域网内的网络在线聊天,其无法实现广域网上的聊
天功能但其网络协议的选择,在线用户统计等开发策略和实现功能对实现广域网
上的聊天程序具有一定的参考价值。且由于其开发过程中采用了 MVC 模式,具有
很高的可扩展性,故在此基础上可以较容易的转换为广域网聊天程序。
由于用来在局域网内聊天使用,故程序设计中未考虑网络协议的优化以及
传送信息的加密和压缩。如想扩展软件的功能,这几点是需要进一步考虑的。
QQ 精灵 1.0 主要为学习而设计,其功能相比网络聊天方面已经成熟的产
品有很大的不足,其功能上来讲并不具通用性,有很大的进一步完善的空间。
2)
3)
3. 由 QQ 精灵 1.0 的实现分析各种技术在网络相关程序实现上的优缺点
通过对 QQ 精灵 1.0 的设计、实现和分析,可以说明 JAVA 作为一种编程语言用来开发
网络方面的程序具有明显优势,也有其本身难以克服的劣势:
JAVA 的优势方面,其能够提供规范、友好的用户界面,对于如何在各种网络环境下实
现不同的程序功能,JAVA 有着完整的解决方案,且实现起来极为简单,同时,JAVA 开发的
程序具有平台无关性,可以运行在任何系统环境下,同时,JAVA 本身的接口和扩展能力较
强,使得程序可以很容易的同其他基于 JAVA 的程序或功能模块契合在一起。
至于 JAVA 在开发网络方面程序的劣势包括:它与其他很多实现方法,如完全的 C++环
境等,相比较而言速度较慢,尤其是基于 C/S 模式的网络程序。且基于 JAVA 的程序运行起
来要求资源较多,对于极耗资源的网络相关软件更是如此。同时,基于 JAVA 开发的程序在
某些 JAVA 独有的功能、方法等方面的实现,对于其他解决方案,诸如 VC++、 Delphi、C#
等可参考价值不大。
4. 小结
本文简要介绍了网络聊天程序 QQ 精灵 1.0 的开发思路、流程以及开发过程中涉及到的
JAVA、MVC、多线程等技术,分析了使用 JAVA 实现网络聊天程序的具体方法及实现难点,并
由此进一步分析了程序中使用到的各种技术在开发网络相关程序时的优势以及劣势。本文对
于使用各种开发环境开发不同的网络相关程序以及学习使用 JAVA 或 MVC 等技巧的人都有一
定的参考价值。
[参考文献]
1. 范建华 TCP/IP 详解卷 1:协议 北京:机械工业出版社, 2000-04
2. 陆雪莹,蒋慧,等 TCP/IP 详解卷 2:北京:机械工业出版社, 2000-02
3. Douglas E.Comer 著 林瑶,蒋慧,杜蔚轩译 用 TCP/IP 进行网络互联卷 1
-原理、协议与结构 北京:电子工业出版社,2001
4. 刘永 计算机网络原理与技术 北京:科学出版社 2000
5. 谢东亮,程时端,阙喜戎 对等网络的研究与进展 中国通信器材商务网“h
ttp://www.c114.net/technic/ZZHtml_20055/T2005523149279653-1.shtm
l”