基于Java的即时聊天系统的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
苏州工业园区服务外包职业学院
毕业设计
题目: 基于Java的即时聊天系统的设计与实现
届别2019
系别信息工程学院
专业软件技术
班级
姓名
学号
指导教师
摘要:
随着互联网的高速发展,产生了很多的网络聊天工具。
凭借着其快速,高效的优点十分迅速的在网民中散播开来。
从本质上而言,即时聊天系统开发通常涵盖下述基本内容。
其中涵盖服务器端设计,此外还涉及到客户端设计。
前者旨在基于Socket套接字,积极构建出相应的服务器,随后即可针对来源于客户端的相关信息,进行精准的读取,并实现转发操作。
此外,还可针对新用户列表进行跟踪刷新。
后者的设计原理,即基于和服务器之间,积极构建出稳定的连接,以此来实现多样化客户端彼此之间的良好交互。
对于本文所研发的服务器端而言,其重点涵盖若干子模块。
其中包含注册模块以及聊天模块。
除此之外,还涉及到登录模块以及相应的后台管理模块。
关键词:即时聊天系统;套接字;Java;
Abstract
With the rapid development of the Internet, a lot of online chat tools have been produced.With its fast, efficient advantages very quickly spread among netizens.The development of instant messaging system mainly includes two aspects: server-side design and client-side design.The server-side design mainly establishes the server through Socket sockets. the server can read and forward the information sent from the client, and can also refresh the list of users.The client design mainly carries on the information exchange between the client and the client by establishing the connection with the server.
The server side of the system mainly includes several sub-modules: registration module, login module, chat module, background management module.
Keywords:Instant chat system;Socket;Java
目录
题目: 基于Java的即时聊天系统的设计与实现 (1)
摘要: (2)
Abstract (2)
第1章前言 (3)
第2章可行性分析 (4)
2.1经济可行性 (4)
2.2技术可行性 (4)
2.3操作可行性 (4)
2.4法律可行性 (5)
第3章需求分析 (5)
3.1系统基本功能描述 (5)
3.2系统需求分析 (5)
3.3数据流图 (5)
3.4用例图 (7)
3.5数据库设计 (8)
1、数据库需求分析 (8)
2、概要设计 (8)
3、逻辑设计 (10)
4、物理设计 (11)
第4章系统概要设计 (15)
4.1系统总体流程图 (15)
4.2系统功能模块划分 (15)
第5章系统详细设计与实现 (18)
5.1系统设计与实现。
(18)
5.1.1注册模块 (18)
5.1.2登录模块 (21)
5.1.3聊天模块 (23)
5.1.4后台管理模块 (25)
结论 (29)
致谢 (30)
参考文献 (30)
第1章前言
人类从蛮荒的原始社会发展到今天高度发达的文明社会。
在这其中,人类之间懂得互相交流来取长补短是人类发展的一项重要技能。
现如今,中国社会已经逐步获得相对稳定的蓬勃发展,交流方式也随之趋于多样化。
从最早的交流方式——直接交流(语言、文本等),到使用媒体的沟通方式——间接沟通(飞翔的
鸽子、烽火等),然后,在现代,工业革命的结果被用于创造远程通信方法(电报、电话等)。
到了上个世纪末,在当前时期,计算机技术正处于迅猛发展的过程当中,一种新型的通信方式,即时聊天系统诞生了。
这种新型通信方式所展现的优点是以前的交流方式没法比的。
本文旨在针对以Java语言为基础,而成功构建的即时聊天系统,进行更深层次的细致研究。
即时聊天系统是一种以满足用户之间即时进行信息交换为宗旨的系统。
该系统的主要特点是可以动态和实时的完成信息的传输。
第2章可行性分析
任何系统的开发都受到一些限制,列如时间和资源。
因此,在开发每个系统之前,必须进行可行性分析,唯有如此,才能有效规避由于软件开发而引发的风险。
也大大避免了在物力、人力和财力上的浪费。
[1]
对于该系统而言,其所涉及的可行性分析,需要涵盖下述基本内容。
例如:经济可行性以及相应的操作可行性等。
2.1经济可行性
近年来,计算机网络备受青睐,逐步获得相对广泛的实际应用。
在此背景下,仅需借助于MySQL数据库服务器发挥的作用,即可维持系统所需。
值得一提的是,Oracle数据库服务器无需耗费高昂的经济成本。
因此该系统的设计在经济上是完全可行的。
2.2技术可行性
此类系统将能借助于MySQL的作用,针对多样化用户所涉及的基本信息,进行及时存储。
而Oracle运行时比较占用内存,虽然它集成了很多功能,但很多功能我们用不上,所以MySQLl是很符合我们的需求的。
通常情况下,MySQL旨在将各种类型的数据存储至对应的表格当中。
所以安全度是很高的。
并且MySQL 无需耗费高昂的经济成本,即可达到相对迅猛的运行速度错误!未找到引用源。
使用JDBC技术添加,删改和更改,借助于套接字的作用,将可有助于客户端与服务器彼此之间的紧密连接。
故而如果基于技术角度进行考量,则本系统在设计方面,基本满足可行性要求。
2.3操作可行性
首先,本地机器能够基于某特定机器,将即时消息看做成客户端亦或为相应的服务器。
与此同时,仅需将若干计算机尽数连接至某特定的局域网当中,并将
亟待连接的某特定服务器端所含有的IP地址,尽数设定成系统的客户机。
在此情况下,系统将能进行局域网通信。
从这一角度而言,本系统在操作方面,基本满足可行性要求。
2.4法律可行性
这种实时聊天系统的开发不会侵犯到他人的专利权,也不会违反国家的有关规定,因此在法律上是可行的。
第3章需求分析
3.1系统基本功能描述
客户端能够执行注册,即时聊天以及收发接受文件等一系列操作。
值得一提的是,在收发消息的过程中,还能进行离线接收。
服务器端需要积极构建出Server Socket,与此同时,还应针对客户端的实际状态进行跟踪监听。
在后台管理系统,可以添加,删除和更改用户,查看在线用户以及使用户脱机。
3.2系统需求分析
服务器端应该完成的工作包括:
(1)服务器端需要积极构建出某特定的Server Socket,此外还应针对客户端的实际状态进行跟踪监听。
(2)各种类型的客户端信息,均应实时传递至相应的服务器端。
在此之后,服务器端应当基于实际需求,来分发多样化关键信息。
客户端应该完成的工作包括:
(1)和服务器彼此之间,积极构建出相应的通信通道,以此来实现向某特定的服务器端,实时发送指定信息。
(2)实时接收来源于服务器端所发送的相关信息。
3.3数据流图
数据流图的本质在于体现出系统的基本逻辑。
通常情况下,在结构化系统分析过程当中,以及在软件模型的直观表达上,均需应用到数据流图。
[2]
1.顶层数据流图
图3.3.1系统顶层数据流图2.客户端数据流图
图3.3.2客户端数据流图3.服务器端数据流图
图3.3.3服务器端数据流图
3.4用例图
1.普通用户的用例图:
图3.4.1普通用户用例图2.后台管理员的用例图:
图3.4.2后台管理员用例图
3.5数据库设计
1、数据库需求分析
从常理上来看,聊天系统需要涵盖用户基本文件所涉及的各类数据表。
本文重点涵盖用户表,该表旨在针对多样化用户所涉及的基本信息,进行及时存储。
此外还涉及到消息表,该表旨在针对多样化用户所涉及的离线聊天消息,进行及时存储。
2、概要设计
本文基于针对数据库进行科学合理的需求分析,决定设计出账户实体以及离线消息实体等一系列实体,用以针对性反映出现实生活当中某些对象所涉及的数据关系。
系统E-R示意图及其部分实体的E-R示意图,详见下图。
系统总体E-R模型
图3.5.2-1系统总体E-R图
用户的基本信息E-R模型:用户(用户密码,用户状态,用户邮箱,用户头像)
图3.5.2-2用户基本信息E-R图
聊天消息的E-R模型:消息(消息ID,消息类型,消息内容,消息发送者,
消息发送时间,消息接收者)
图3.5.2-3聊天信息E-R图
3、逻辑设计
以本文系统数据库为研究对象,其重点涵盖两张表格,依次为用户信息表以及相应的聊天消息表。
前者旨在针对系统当中已经成功注册的全体用户,所涉及的用户名及其相应的密码,进行跟踪记录。
在此之后,相关用户将能基于客户端登录窗口,将自身已注册的用户名及其相应的密码进行正确输入,若其中存在输入错误,即无法登陆。
在此过程中,管理员能够随时浏览。
其中涵盖发送者等基本信息。
4、物理设计
数据库一般基于某特定的逻辑结构,融于相应的环境中当中。
需要注意的是,该环境应当提供科学合理的数据存储结构以及各种类型的存取方法。
(1)USERS表
图3.5.4-1表
创建USERS表格
createtableUSERS
(
u_idINTEGERnotnull,
u_nameVARCHAR(50)notnull,
u_pwdVARCHAR(50)notnull,
u_ipVARCHAR(50),
u_stateVARCHAR(50),
u_genderVARCHAR(50),
u_emailVARCHAR(50),
u_last_loginDATE,
u_last_exitDATE,
u_remarkeVARCHAR(3000),
u_signatureVARCHAR(100),
u_head_imgVARCHAR(100),
u_typeVARCHAR(50),
u_birthdayDATE
)
tablespaceSYSTEM
pctfree10
pctused40
initrans1
maxtrans255
storage
(
initial64K
next1M
minextents1
maxextentsunlimited
);
--Create/Recreateprimary,uniqueandforeignkeyconstraints altertableUSERS
addconstraintPK_USERSprimarykey(U_ID) usingindex
tablespaceUSERS
pctfree10
initrans2
maxtrans255
storage
(
initial64K
next1M
minextents1
maxextentsunlimited
);
(2)MSG表
图3.5.4-2MSG表
创建MSG表格
createtableMSG
(
msg_idNUMBERnotnull,
msg_contentVARCHAR(2000)notnull,
msg_sendfromINTEGERnotnull,
msg_sendtoINTEGER,
msg_sendtimeDATEnotnull,
msg_remarkVARCHAR(3000),
msg_typeVARCHAR(2)
)
tablespaceUSERS
pctfree10
initrans1
maxtrans255
storage
(
initial64K
next1M
minextents1
maxextentsunlimited
);
--Addcommentstothecolumns commentoncolumnMSG.msg_id
is'消息ID';
commentoncolumnMSG.msg_content
is'消息内容';
commentoncolumnMSG.msg_sendfrom
is'消息发送者';
commentoncolumnMSG.msg_sendto
is'消息接收者';
commentoncolumnMSG.msg_sendtime
is'消息发送时间';
commentoncolumnMSG.msg_remark
is'备用';
commentoncolumnMSG.msg_type
is'消息类型,例如:私聊消息;
--Create/Recreateindexes
createindex收发_FKonMSG(MSG_SENDFROM) tablespaceUSERS
pctfree10
initrans2
maxtrans255
storage
(
initial64K
next1M
minextents1
maxextentsunlimited
);
--Create/Recreateprimary,uniqueandforeignkeyconstraints altertableMSG
addconstraintPK_MSGprimarykey(MSG_ID) usingindex
tablespaceUSERS
pctfree10
initrans2
maxtrans255
storage
(
initial64K
next1M
minextents1
maxextentsunlimited);
第4章系统概要设计
4.1系统总体流程图
图4.1系统总体流程图
4.2系统功能模块划分
该系统重点涵盖注册模块以及聊天模块等若干模块,其基本结构示意图,详见图4.2-1。
图4.2-1系统总体功能模块划分
各个功能模块设计如下:
1、注册模块
当处于登录界面当中,用户若键入特定的注册按钮,即可填写必要的注册信息,并传递于服务器。
在此之后,服务器将会和系统数据库之间进行紧密连接,以此来增设该用户的注册记录。
用户注册流程图如图4.2-2:
2、登录模块
当某特定用户已经成功输入自身的账号及其正确的密码之后,将会和服务器端之间进行紧密连接,并实现登录。
其次,系统将会借助于JDBC的作用,针对数据库进行跟踪读取,确认该用户所输入的信息,是否和存储于数据库当中的信息完全一致。
随后,客户端将会向服务器提出申请,以读取存储于数据库当中的好友列表。
然后将该信息发送给客户端,最后于主窗口当中显示出来。
用户登录流程图如图4.2-3:
图4.2-3登录流程图
3、实时聊天模块
首先,系统当中的客户端,即刻向某特定的服务器实时发送相关消息,后者在确定信息类型之后,可执行转发操作。
用户聊天流程图如图4.2-4:
图4.2-4聊天流程图
4、系统后台管理模块
(1)系统服务:管理员将能够基于该类模块,来使用后台服务器,以此来通过聊天室将关键消息,通知于全体用户。
(2)用户管理:管理员将可基于该模块,针对多样化用户所涉及的名称及其正确的ID,进行跟踪修改,并及时储存。
第5章系统详细设计与实现
5.1系统设计与实现。
5.1.1注册模块
本系统在正式登录之前,必须首先注册账户。
用户只有将自身的基本信息,存储至后台数据库当中,才能具备该系统的使用权。
注册界面如图5-1所示。
图5-1用户注册界面
当已经成功注册时,可以借助于JDBC技术的作用,将某特定用户所涉及的相关记录,径直存储至数据库表当中。
其中,注册功能关键代码代码如下:privateclassRegSuccessextendsJDialogimplementsActionListener{
privateJTextAreatxtInfo=newJTextArea();
privateJButtonbtnLogin=newJButton("直接登录");
privateJButtonbtnReturn=newJButton("返回登陆界面");
privateRegUseruser;
publicRegSuccess(RegUseruser,Frameowner,booleanmodal){
super(owner,modal);
er=user;
setSize(250,190);
setResizable(false);
Toolkittk=Toolkit.getDefaultToolkit();
setLocation((tk.getScreenSize().width-
getSize().width)/2,(tk.getScreenSize().height-getSize().height)/2);
setTitle("注册信息");
txtInfo.setText("恭喜!"+user.getRealname()+",注册成功!\n"+
"用户昵称:"+user.getNickname()+"\n"+
"登陆号码:"+user.getJqnum()+"\n"+
"登陆密码:"+user.getPassword()+"\n"+
txtInfo.setEditable(false);
txtInfo.setOpaque(true);
txtInfo.setBackground(this.getBackground());
txtInfo.setPreferredSize(newDimension(200,100));
txtInfo.setBorder(newTitledBorder(newLineBorder(Color.DARK_GRAY),"注册信息"));
setLayout(newFlowLayout(FlowLayout.CENTER,10,10));
btnLogin.addActionListener(this);
btnReturn.addActionListener(this);
add(txtInfo);
add(btnLogin);
add(btnReturn);
setVisible(true);
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==btnLogin){
dispose();
RegisterPane.this.dispose();
newMainPane(txtServerIP.getText(),Integer.parseInt(txtServerPort.getText()),use r.getJqnum(),user.getPassword(),UserState.ONLINESTATE.getState());
}
if(e.getSource()==btnReturn){
dispose();
RegisterPane.this.dispose();
newLoginPane();
}
}
}
其中,注册账号信息基本示意图,详见图5-2:
图5-2用户注册信息
5.1.2登录模块
登录模块验证客户端用户的合法性,首先,将ObjectInputStream对象径直写入至某特定的套接字流,其次,将其传递于对应的服务器当中,两者完全正确方可成功登录。
其基本登录界面示意图,详见图5-3;成功验证后的示意图,详见图5-4
其中,相关用户所涉及的基本登录界面示意图,详见图5-3:
图5-3登录界面图
除此之外,客户端所涉及的好友列表基本界面示意图,详见图5-4:
图5-4好友列表界面
登录模块关键代码如下:
publicvoidlogin()
{
Stringname=textField用户名.getText();
Stringpassword=newString(pwd密码.getPassword());
if(name.equals("")||password.equals(""))
JOptionPane.showMessageDialog(this,"用户名和密码不能为空!","错误",JOptionPane.ERROR_MESSAGE);
else
{
try
{
if(cs_TCP==null)
cs_TCP=newCS_TCP(MyTools.QQServerIP,MyTools.QQServerPort,this,main);
System.out.println("开始检测用户名和密码……");
cs_TCP.sendMessage(Flag.LOGIN+MyTools.FLAGEND+name+MyTools.SPLIT1+p assword+MyTools.SPLIT1+main.getServerPort()+MyTools.SPLIT1+comboBox状态.getSelectedIndex());
}
catch(Exceptione)
{
JOptionPane.showMessageDialog(null,"连接服务器失败!请检查网络连接或确保QQ服务器已启动!");
}
}
}
5.1.3聊天模块
单机好友列表并选择一个朋友,然后双击鼠标打开聊天界面(如图5-5)。
至下方的消息输入框当中,输入相关基本内容并发送,即可将信息传递于对方。
聊天界面如图5-5所示:
图5-5聊天界面
聊天模块关键代码如下:
(1)鼠标事件,完成鼠标进入好友列表中,选择好友,双击与好友进行聊天。
privateclassListMouseAdapterextendsMouseAdapter{
publicvoidmouseMoved(MouseEvente){
//System.out.println(e.getSource());
if(e.getSource()==listFriend){
listFriend.clearSelection();
intindex=listFriend.locationToIndex(e.getPoint());
//System.out.println("index:"+index);
listFriend.setSelectedIndex(index);
}
}
publicvoidmouseClicked(MouseEvente){
if(e.getSource()==listFriend){
if(e.getClickCount()==2){
chatWithFriend();
}
if(e.getButton()==MouseEvent.BUTTON3){
popupMenu.show(listFriend,e.getX(),e.getY());
}
return;
}
if(e.getSource()==btnMenu){
menu.show(btnMenu,e.getX()-25,e.getY()-75);
}
if(e.getSource()==btnSys){
broadcastwindow.showNow();
}
}
}
(2)打开好友聊天窗口。
privatevoidchatWithFriend(){
Objectobj=listFriend.getSelectedValue();
if(objinstanceofFriendUser){
FriendUserfriendUser=(FriendUser)obj;
intjqnum=friendUser.getJqnum();
ChatPanechatPane=chat.get(jqnum);
if(chatPane==null){
chatPane=newChatPane(oos,friendUser,selfUser,true);
chat.put(jqnum,chatPane);
}
elseif(chatPane.isDisplayable()){
chatPane.setFocusable(true);
chatPane.setState(NORMAL);
}
else{
chatPane.setVisible(true);
}
}
}
packagedata;
importjava.io.Serializable;
importjava.util.Date;
5.1.4后台管理模块
本系统所涉及的后台管理功能,重点涵盖系统服务基本功能,除此之外,
还涵盖用户管理基本功能。
1.系统服务功能
在系统服务中,管理员能够跟踪控制服务器的状态,并可随时随地查询数据库。
其基本功能实现示意图,详见图5-6:
图5-6服务器端系统服务功能
关键代码如下:
/**
*启动服务器。
*@throwsIOExceptionIO异常。
*/
publicvoidstartServer()throwsIOException{
isServiceRun=true;
intport=Integer.parseInt(Server.prop.getProperty(GetParameter.keys[0]));
table=newHashtable<Integer,ClientLink>();
server=newServerSocket(port);
newThread(this).start();
writeSysLog(DateDeal.getCurrentTime()+",JQ服务器服务启动成功!等待JQ用户上线...");
}
/**
*停止服务器。
*@throwsIOExceptionIO异常。
*/
publicvoidstopServer()throwsIOException{
isServiceRun=false;
Enumeration<ClientLink>en=table.elements();
while(en.hasMoreElements()){
ClientLinkclient=en.nextElement();
client.updateUserState(client.jqnum,UserState.OFFLIENSTATE.getState());
client.letClientQuit();
}
table.clear();table=null;
if(server!=null)
server.close();
server=null;
writeSysLog(DateDeal.getCurrentTime()+",JQ服务器服务停止成功!");
}
2.用户管理功能
用户管理的本质,即针对已经成功注册的多样化用户的基本信息,借助于JDBC的作用,来实现统筹管理。
功能实现如图5-7所示:
图5-7用户管理图
关键代码如下:
/**
*用户管理面板类。
*/ publicclassUserPaneextendsJPanelimplementsActionListener,Runnable{ /**查询JQ用户*/
privateJLabellblQuery=newJLabel("查询JQ用户");
/**输入的查询的关键字*/
privateJTextFieldtxtQuery=newJTextField("");
/**查询的类型*/
privateJComboBoxboxQuery=newJComboBox();
/**查询*/
privateJButtonbtnQuery=newJButton("查询");
/**添加新用户*/
privateJButtonbtnAddNew=newJButton("添加新用户");
/**刷新重新获得所有用户*/
privateJButtonbtnFlash=newJButton("刷新");
/**显示用户的表格*/
privateJTabletable=null;
/**表格的模型*/
privateDefaultTableModelmodel=null;
/**状态栏*/
privateJLabellblInfo=newJLabel("共有JQ用户:0");
privateJPopupMenupopupMenu=newJPopupMenu();
privateJMenuItemitemChange=newJMenuItem("修改");
privateJMenuItemitemDelete=newJMenuItem("删除");
publicUserPane(){
init();
btnAddNew.addActionListener(this);
btnFlash.addActionListener(this);
btnQuery.addActionListener(this);
}
结论
本文旨在针对即时聊天系统,进行更深层次的细致研究。
在此过程中,笔者首先针对当前现状进行详细描述,并依次进行系统建模,最终完成此次系统实现。
全程笔者均运用到学校中教授的各科基础知识,并将其应用至实践当中。
值得一提的是,该系统旨在借助于经济性良好的Eclipse的作用,来实现开发。
因为时间因素,本文仅仅设计登录模块以及相应的文本聊天模块等若干模块,
成功解决的问题:
1、怎样基于服务器端,针对来源于客户端所发送的诸多请求,进行相对深入的细致处理呢。
我一开始不知道该怎么做,然后我查询了相关信息,并根据他人的实践设计了一个Message类,接收方接收后,根据Message对象的属性判断自身,然后相应地处理它。
2、离线消息推送。
笔者首先将离线好友所受到的全体消息,均集中写入至系统的数据库当中。
一旦某好友登录,即开启特定的线程,将msg当中存在的内容推送至该好友,并及时删除。
本次毕业设计实则为三年学习成果的检验。
通过互联网和阅读书籍,我解决了许多我以前从未遇到的问题,我感到非常满足,使我受益匪浅。
致谢
时光飞逝,本次毕业设计即将结束,三年的大学生涯转瞬即逝,即使心中存有遗憾和不舍,也不得不与各位尊敬的授课老师和亲爱的同学们一一告别。
在本次毕业设计过程中,尤其感谢蔡老师的悉心指导,无论是在论文选题方面,还是在论文构思方面,蔡老师都给予了我很多建设性的意见,在此向他表示诚挚的谢意! 在过去的几个月里,蔡老师给了我的不仅仅是帮助撰写论文。
我对她丰富的知识,深刻的学术素养,严谨的学术精神和一丝不苟的工作作风留下了深刻的印象。
让我受益终生。
与此同时,许多小伙伴也热情地帮助撰写了这份毕业论文,正是由于他
们的帮助,弥补了我在一些知识上的匮乏,加快了本文的进度,并帮助我按
计划完成毕业论文。
大学的三年学习时间即将完成,也即将要告别学院的恩师和给位同学了,内心控制不住的怅然若失。
在此我对我的母校,老师及其父母,表示最诚挚的谢意。
参考文献
[1](美)马劳克林.深入浅出Ajax(中文版)[M].南京:南京大学出版社,2008.
[2]BrueeEekel.ThinkingInJava(第三版)[M].北京:机械工业出版社,2005.2.。