即时通信系统的设计与实现.docx
- 文档编号:12791671
- 上传时间:2023-04-22
- 格式:DOCX
- 页数:27
- 大小:555.94KB
即时通信系统的设计与实现.docx
《即时通信系统的设计与实现.docx》由会员分享,可在线阅读,更多相关《即时通信系统的设计与实现.docx(27页珍藏版)》请在冰豆网上搜索。
即时通信系统的设计与实现
即时通信系统的设计与实现
摘要:
局域网即时通信是一个企业内部进行组织和交流的重要工具。
本文严格按照Rational统一过程构建了一个即时通信系统,重点研究了规范的软件架构过程及关键技术JMS、JMX、EJB和Mbean在本系统中的应用,通过数据包在局域网中的传送、信息处理任务在服务器和客户端的合理分配实现了高效的即时信息交流,提高了企业内部的信息安全性,节约了成本,在企业管理中有重要的应用价值。
关键字:
即时通信;统一建模语言;统一软件开发过程;Java消息服务
1引言
1.1选题的背景和意义
根据来自OstermanResearch的调查报告,已经有84%的企业的网络中使用了不同形式的即时信息软件,到2007年,即时信息软件的使用将会遍及所有的企业[1]。
不同于QQ、MSN等即时通信软件,在局域网内部构建的即时通讯系统以其易用性、安全性、实时交互、资费低廉等优点,被越来越多的企业所青睐,极大降低了公司的管理成本,把公司的管理提高到了一个新的层次。
本文提供的即时通信系统是微盟电子公司的一个titan项目的子项目,由本人和另外两位公司新员工在经验丰富的软件工程师的耐心指导下完成。
本系统的整个开发过程严格按照软件工程的规范进行,以提高开发效率、降低软件维护难度,增强软件的可扩展性。
1.2技术概要
本即时通信工具的开发采用目前最流行的Java语言及相关的Swing技术、J2EE技术、EJB技术、JMX技术、MBean技术(managedbean)和JMS技术(JavaMessageServer)。
总体采用3层的客户机/服务器(C/S)模型进行设计,包括:
数据库服务器,应用程序服务器端,应用程序客户端。
Java的可移植性是其广为流行的最大优势,也是本系统选用它作为开发语言和开发平台的原因;使用其Swing控件开发的用户图形界面简洁明了,美观方便;在各个层次的组件划分中还使用到了J2EE和EJB,分别对各个层次的消息进行处理。
同时对框架结构的管理采用的是JMX,MBean负责客户端和服务器的会话连接管理,但其状态维护由EJB负责。
消息的发送与接收通过Java消息服务JMS实现。
JMS为每个用户建立自己的消息队列,通过消息队列给在线用户发送接收到的消息。
[2][3]
1.3Rational统一过程
统一建模语言(UnifiedModelingLanguage,UML)是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。
UML适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具,UML是一种总结了以往建模技术的经验并吸收当今优秀成果的标准建模方法[4]。
Rational统一过程(RationalUnifiedProcess,RUP)是Rational软件公司(UML的诞生地,已经被IBM并购)创造的软件设计方法学,与敏捷过程和微软过程并称为当今软件界最具影响力的三种软件开发过程,它不仅为大多数软件开发环境提供了一个可供裁剪的过程框架,还在于它为软件开发提供了一个兼顾技术和管理的完整视角。
在其基础上,可以方便的集成软件工程领域的最新实践成果,如“软件重用”,“逆向工程”,“软件架构”,“面向方面”和“主动过程”等内容,形成更加完善的软件研发解决方案[5]。
在本即时通信系统的研发过程中,我们严格遵循Rational统一过程进行系统建模、分析与设计,充分利用这一迭代的、增量的、用例驱动的开发过程所具有的优势,以提高开发效率,增强系统的可维护性。
本文第3、4章的类关系图和过程都是采用RUP的方法设计,更多的技术细节和模块设计请参考本论文所附的源代码。
1.4系统需求和开发环境
1、Windows2000以上,或者内核为2.6以上的任何Linux系统发行版
JBOSS4.X、MySQL4.X
Java2StandardEditionSDK1.5
2、Eclipse:
这是由IBM捐出4000万美金支持的开放源代码的项目。
Eclipse不但是一个非常优秀的集成开发环境(IDE),而且对UML提供支持[6]。
3、Jboss:
目前,实现J2EE标准的主要产品包括Sun公司的SunONE系统、IBM的WebSphere应用服务器、BEA的WebLogic平台软件等。
Jboss是在性能上可以与这些产品相媲美的免费的开发源代码项目。
其出众的特点是JBoss服务器的实现是建立在JBoss微小内核的基础上的,这使得JBoss的启动速度很快,差不多比J2EE的标准实现快了10倍,而且JBoss也比其他产品所需要的内存容量和磁盘空间要少得多。
[7]
4、MySQL:
是由瑞典的T.c.X.DataKonsultAB公司开发的开放源代码的数据库系统。
是一个多用户、多线程的SQL数据库,是一个客户机/服务器结构的应用,它由一个服务器守护程序MySQL和很多不同的客户程序和库组成。
[8]
2需求分析
2.1软件系统概述
该即时通信软件plutomessage的目标是能够在局域网内部利用该软件进行交流,可作为公司、企业的内部交流工具使用,即充分要求有两个界面:
sever端界面和client端界面,sever端要求可以通过界面设置用户和修改用户的属性,client端要求可以,登录,查询通知,查找好友,聊天功能模块等。
2.2软件系统功能简介
该软件系统具如下具体功能:
●用户登陆:
到数据库服务器中验证用户名和密码是否匹配,如果匹配将用户名传递给下一个页面去处理,如果不匹配则提示错误信息。
●用户登出:
主画面选择“登出”进入原始登录画面,退出系统。
●显示、查询好友信息:
进入主画面,选择好友,显示好友详细信息。
●聊天:
选择好友,输入内容,发送,成功对方将被通知收到新信息,失败,显示原因。
●管理聊天记录:
选择好友,显示出用户和其选择好友的所有聊天记录,聊天记录包括字段:
From、To、Senttime、Receivedtime、Messagecontent。
可排序记录和删除一条或多条记录。
●管理私人档案:
进入私人档案,显示私人档案信息,修改档案,可改档案信息包括:
名字、密码、头像、自我描述、E-MAIL。
修改后通知其他好友。
3概要设计
3.1概要设计简介
概要设计,是将软件需求转化成逻辑过程的一种设计手段。
在此阶段我们将产出:
●用例分析图
根据“需求分析”,将用户和系统的交互分类,以产出一个初步逻辑示图。
●边界分析图
根据“用例示图”,详细表示每个用例所有的参与者之间的逻辑关系的一个逻辑示图。
3.2用例图
用户可以进行的几个操作活动:
Login/Logout为用户登陆和退出系统时进行的活动,这是每个用户在使用该软件时必须进行的操作;Communicate为用户和自己的通讯录内的好友进行信息交流时进行的活动,用户在在线好友组内选择选择要与其进行信息交流的好友即可给其发送信息;QueryFriendsInfo为用户查看通讯录内好友描述信息时进行的操作,用右键点击在线的好友,在弹出的菜单中选择查看好友选项即可查看在线好友的基本描述信息;ManageHistory为用户查看通讯录内好友的聊天记录时进行的操作,其操作与查看好友基本信息类似;ManageMyProfile为用户修改自己的简要信息描述时进行的操作,用户在菜单栏即可完成相关的操作。
用例图如下图所示。
图1用户功能模块用例图
3.3边界分析图
用户和好友进行聊天通信的整个过程:
用户首先在MainFrame模块中选定一个在线的好友,然后通过ChatView模块让用户输入聊天信息,接着聊天信息发送给Communicator模块处理。
Communicator模块把聊天信息发一份给HistoryRespository模块存储,同时发一份给在线的好友。
过程如下图所示。
图2聊天模块边界分析图
4详细设计
4.1总体架构
PlutoMessage是一个Client/Server模式的程序,包括客户端和服务端两部分。
服务端使用StatefulSessionBean对外暴露服务端的功能,使用JMS(JavaMessageService)给客户端发送消息。
在PlutoMessager的服务端中,消息指的是服务端发送给客户端的一段数据,描述了服务端的状态的变化,聊天的文字消息仅仅只是服务端发送给客户端的一种消息。
服务端发送给客户的消息分为4种,具体的信息如下:
表1服务端发送消息列表
LoginMessage
当一个用户登陆成功后,这个用户的所有在线的好友都会收到一条LoginMessage
LogoutMessage
当一个用户注销后,这个用户的所有在线的好友都会收到一条LogoutMessage
FriendInfoChangeMessage
当一个用户修改自己的个人信息后,这个用户的所有在线的好友都会收到一条FriendInfoChangeMessage
ChatMessage
当一个用户给他的好友发送文本聊天信息时,这个好友,会收到一条ChatMessage
客户端是一个GUI程序,通过EJBClientAPI和服务端的StatefulSessionBean通信,使用JMSClientAPI收取服务器发送的消息。
客户端要以一种直观,简洁的方式呈现数据,接受用户的指令,便于用户使用。
整个PlutoMessager的结构图如下:
图3PlutoMessager的总体架构图
4.2服务端设计
4.2.1ChatUserSessionBean的实现
ChatUserSessionBean和相关类的关系如图所示:
图4ChatUserSessionBean和相关类的关系图
ChatUserSessionBean是服务器对外暴露的功能的入口点,每当一个用户连接到服务端后,服务器都会生成一个ChatUserSessionBean的实例,用户通过这个实例访问服务器的所有功能,每一个ChatUserSessionBean的实例都有一个PlutoDataStorage的实例和一个PlutoMessageEngine的实例.其中,PlutoDataStroage负责访问数据库,实现所有数据的存储功能,PlutoMessageEngine负责维护一个在线用户的列表和负责消息的发送.PlutoDataStorageProvider和PlutoMessageEngineProvider分别是PlutoDataStorage和PlutoMessageEngine的提供者,通过使用这种方式,实现了ChatUserSessionBean的逻辑功能与数据的具体存储方式以及消息的具体发送方式无关.
ChatUserSessionBean是一种StatefulSessionBean,这种EnterpriseBean的特性是当且仅当用户连接到服务器时,才被服务器生成,当用户和服务器断开连接后,被服务器回收.ChatUserSessionBean提供的接口函数和功能如下:
表2ChatUserSessionBean提供的接口函数和功能
login
用户身份验证
logout
用户注销
getFriends
取得用户的好友列表
sendMessage
向该用户的一个好友发送一条消息
changePassword
修改用户的登陆密码
changeUserInfo
修改用户的详细信息
getHistoryOfAnUser
取得用户和某一个好友的聊天记录
cleanHistoryOfAnUser
删除用户和某一个好友的聊天记录
ChatUserSessionBean的几个关键函数的流程如下:
Login:
图5ChatUserSessionBean的login顺序图
sendMessage:
图6ChatUserSessionBean的sendMessage顺序图
4.2.2PlutoDataStorage的实现
PlutoDataStorate是服务端用来进行数据存储的功能模块,PlutoDataStorage只是一个纯粹的功能接口,在服务端,PlutoDataStorage的实现体EntityDataStorage通过访问UserEntityBean和MessageEntityBean实现了数据的存储功能,UserEntityBean和MessageEntityBean是两个EntityBean,分别用于存取用户的数据和聊天历史的记录。
PlutoDataStorage和相关类的关系如图所示:
图7PlutoDataStorage和相关类的关系图
PlutoDataStorage(EntityDataStorage)的各个函数的功能如下:
表3PlutoDataStorage(EntityDataStorage)的各个函数的功能表
validateUser
用户身份验证,通过UserEntityBean实现
getUserInfo
取得用户的详细信息,通过UserEntityBean实现
changeUserInfo
修改用户的详细信息,通过UserEntityBean实现
changeUserPassword
修改用户的登陆密码,通过UserEntityBean实现
getFriendsOfAnUser
取得用户的所有的好友的信息,通过UserEntityBean实现
getMessageOfAnFriend
取得用户和一个好友聊天的历史纪录,通过MessageEntityBean实现
saveMessage
保存用户的聊天记录,通过MessageEntityBean实现
deleteMessageOfAnFriend
删除用户和某一个好友的聊天记录,通过MessageEntityBean实现
4.2.3PlutoMessageEngine的实现
PlutoMessageEngine是服务端用来发送消息的功能模块。
PlutoMessageEngine的功能有:
判断该用户是否已经登陆、向在线用户发送消息。
PlutoMessageEngine只是一个纯粹的功能接口,在服务端,PlutoMessageEngine的实现体ManagedBeanMessageEngine通过访问MessageEngineMBean实现服务器中的全程对象,用以保存全局信息,MessageEngineMBean是一个JMX(JavaManagementExtension)的MBean,MessageEngineMBean内部有一个在线用户的信息列表,另外,MessageEngineMBean还使用JMS(JavaMessageService)为每一个在线的用户创建一个消息队列,Pluto就是通过这个消息队列实现消息的收发的。
PlutoMessageEngine和相关类的关系如图所示:
图8PlutoMessageEngine和相关类的关系图
PlutoMessageEngine(ManagedBeanMessageEngine)的各个函数的功能如下:
表4PlutoMessageEngine的各个函数的功能表
registerUser
用户上线,为用户分配一个消息队列
unregisterUser
用户下线,销毁用户的消息队列
isUserRegistered
判断一个用户是否上线
sendMessage
给一个用户发送一条消息
sendAllMessage
给除了当前用户外的其他所有在线用户发送一条消息
4.3数据库设计
Pluto的服务端的数据库服务器使用MySQL实现,Pluto服务端使用的数据库叫pluto,数据库中有两个数据表,分别为userdef和messagedef,这两个数据库的模式如下表:
表5userdef表
userdef
字段
数据类型
描述
UserID
integer
用户ID,主关键字
UserName
varchar(22)
用户登陆名,关键字
Password
varchar(22)
用户登陆密码
varchar(100)
用户的电子邮件,可选
UserIconID
integer
用户的头像编号
NickName
varchar(22)
用户的别名,可选
Description
varchar(255)
用户的自我描述,可选
表6messagedef表
messagedef
字段
数据类型
描述
MessageID
integer
消息ID,主关键字
UserID
integer
消息所有者ID
SenderID
integer
发送者ID
ReceiverID
integer
接收者ID
SendTime
datetime
消息发送时间
ReceiveTime
datetime
消息接收时间
Content
text
消息的内容
数据库的创建脚本参考附录。
4.4客户端设计
客户端是一个用采用MVC模式写成的GUI程序,包括taskengine、clientcore、和swingui三部分,三部分的功能如下:
表7客户端GUI程序功能表
taskengin
taskengine是客户端负责和服务器通信的模块,除了消息接收的工外,所有和服务器交互的功能都在taskengine中实现
clientcore
clientcore是客户端的核心框架,主要功能是
●定义客户端的逻辑UI接口
●接收用户的输入请求
●协调客户端的各窗口的数据同步,把户的请求发送到服务器
●接受消息
swingui
Swingui是一个用JavaSwing实现的物理UI,实现了clientcore中定义的逻辑UI接口。
PlutoTask是这八种task的基类,PlutoTaskEngine是task的执行者,PlutoTaskListener是用于监听task执行过程的一个接口。
客户端在需要调用服务端提供的功能的功能的时候,只需要提交一个相对应的task到PlutoTaskEngine的队列中就行,PlutoTaskEngine被激活之后就一直监视自己的队列,一旦队列中有task存在,就会把task发出去,然后在另外的线程中去执行这个task.
服务端是通过SessionfulBean对外暴露功能的,task和服务器通信就是使用EJBClientAPI去调用ChatUserSessionBean提供的函数。
这8种task和PlutoTaskEngine等相关类的关系如下:
图9task和PlutoTaskEngine等相关类的关系图
4.4.1clientcore
clientcore是客户端的核心框架,主要功能是
●定义客户端的逻辑UI接口
●接收用户的输入请求
●协调客户端的各个窗口的数据同步,并通过taskengine把用户的请求发送到服务器
接受消息
在客户端,view表示逻辑UI,一种View代表和用户直接交互的一种窗口,任何一种view都有一个与之对应的controller存在,controller是客户端的逻辑功能所在,controller和view的交互关系为:
view会捕捉用户的所有操作,然后view会把捕捉到的操作提交给相对应的controller,vontroller收到view提交的操作后,会进行一些逻辑处理,然后会把结果反馈给view,让view去显示这些结果,如果controller无法处理view提交的操作,controller会把这些请求提交给其他的controller去处理。
在客户端中,view和controller之间、controller和controller之间使用事件来互相通信。
controller之间的通信是通过controller的管理者-application对象来负责的。
application对象负责生成所有的controller,并负责在controller之间中转事件。
view、controller和application之间的关系如下图:
图10view、controller和application之间的关系图
PlutoView就是view的,PlutoController就是controller,PlutoApplication就是application,EventTarget是一个抽象的接口,实现了这个接口的类都将具备接受事件的能力,PlutoController和PlutoApplicaiton都实现了EventTarget接口。
PlutoMessager中,有8种不同的view,分别表示八种不同的窗口,这8种view关系如下图:
图11View之间的关系图
PlutoMessager中有10种controller存在,这10种controller关系如下图
图12controller之间的关系图
4.4.2swingui
swingui是PlutoMessager的物理UI,它用JavaSwing实现了8种窗口,分别与clientcore中定义的8种view相对应,他们是真实的用户看到的窗口。
这八种窗口如下:
表8swingui对应的view
MainWindow
实现了MainView
LoginWindow
实现了LoginView
FriendInfoWindow
实现了FriendInfoView
MyProfileWindow
实现了MyProfileView
ChatWindow
实现了ChatView
ChatHistoryWindow
实现了ChatHistoryView
ChangePasswordWindow
实现了ChangePasswordView
AboutWindow
实现了AboutView
把UI分为逻辑UI和物理UI,可以把接口和实现分开,可以在不更改程序内部逻辑的情况下,轻而易举的修改物理UI。
在PlutoMessager中,物理UI直接和逻辑UI相隔离,这样,如果要用其他的UI技术,比如SWT(StandardWidgetToolkit),来重新实现UI,只需要实现逻辑UI声明的功能即可,而不需要更改clientcore。
4.5客户端UI设计
1、主窗口
主窗口为用户运行程序时的第一个窗口,窗口界面如下图:
图13用户登陆成功后的窗口图
2、聊天窗口
通过聊天窗口的,你可以实现与好友的聊天,显示聊天时间,清除聊天记录,隐藏聊天窗口,和关闭聊天窗口。
图14聊天窗口图
3、聊天历史记录
要求能记录与好友之间的聊天记录,具体的实现窗口如下:
图15聊天记录图
当无聊天记录时应显示窗口:
图16无聊天记录图
5本系统的架构分析
本系统架构的独到之处在于在服务器端巧妙地应用了JMS的消息队列处理机制高效地解决了消息在服务器端进行处理和转发的复杂的逻辑过程,这是本系统有别于其他即时通信工具(QQ,MSN)的地方。
5.1Java消息服务-JMS
JMS仅仅是由包括SunMicrosystems和IBM等在内的几个公司合作设计的一种叫做MOM(message-orientedmiddleware,面向消息的中间件)的软件底层的API,其定义了Java中访问消息中间件的两个接口:
第一个接口定义了客户端与消息服务
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 即时 通信 系统 设计 实现