聊天程序JAVA课程设计报告书.docx
《聊天程序JAVA课程设计报告书.docx》由会员分享,可在线阅读,更多相关《聊天程序JAVA课程设计报告书.docx(28页珍藏版)》请在冰豆网上搜索。
![聊天程序JAVA课程设计报告书.docx](https://file1.bdocx.com/fileroot1/2022-12/17/ba0f7ab4-1bfa-4954-bfc6-4b0f6ae90a6c/ba0f7ab4-1bfa-4954-bfc6-4b0f6ae90a6c1.gif)
聊天程序JAVA课程设计报告书
*******************
实践教学
*******************
理工大学
计算机与通信学院
2013年秋季学期
JAVA课程设计
题目:
聊天程序
专业班级:
计算机科学与技术
姓名:
学号:
指导教师:
成绩:
_____________
摘要
聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQLServer2005完成并通过JDBC数据库。
本设计建立在JAVA平台上,本设计使用了面向对象技术和面向对象的设计原则。
系统采用C/S结构,客户端与客户端以与客户端与服务器端之间通过Socket传送消息。
使用JAVA语言编写,开发工具采用Eclipse。
服务器端设计与实现过程中,采用了多线程技术,可以在单个程序当中同时运行多个不同的线程,执行不同的任务。
大大增强了程序对服务器资源的利用。
聊天系统完成后将可进行多人对多人的聊天,对好友进行添加、删除,对新用户的注册,发送消息、接受消息等等功能。
关键字:
C/S;数据库;Eclipse;Socket;多线程
序言
在网络越来越发达的今天,人们对网络的依赖越来越强,网络聊天已经成了许多人生活中必不可少的一部分,基于这样的需求,出现了许多网络聊天通信工具,像,MSN等等,但是人们已经不再满足于单一的两个人之间的聊天,而是对多人同时聊天产生了兴趣,于是出现了网络聊天室,不同地方的人可以在那个虚拟的聊天室里面热烈聊天。
基于这样的想法,我们用JAVA设计一个多人同时聊天的小程序,用Socket编程实现网络通讯,面向连接的,采用多线程的实现技术。
基于Socket的局域网通信软件可以为企业原有的局域网提供一种良好,安全,快速的通信机制。
它的实现无需对企业原有的局域网硬件进行任何改动,具有实现成本低廉的优点,它的使用能有效地降低局域网通信负荷,提高局域网的使用效率,可以很好地解决企业部局域网的各种通信需求。
基于Socket的局域网聊天工具是此类局域网通信软件的具体实例之一,它很好地诠释了Socket通信的原理,并且在企业部通信、教学、讨论等应用中都具有一定的实用价值。
它具有信息收发速度快,性好,占用网络带宽资源低,占用服务器吞吐能力低,易于编程实现等优点。
基于Socket的局域网通信软件应用围广阔,不但可以处理传统的通信需求,而且也能扩展以适应新型的网络应用,如网络教育,数据影音传输等,拥有广泛的应用前景。
第1章系统分析与设计
随着互联网的发展,网上聊天已经成为当今的一种时尚,,MSN等聊天工具为人们提供一个更为广大的交流平台。
本设计的聊天系统实现了网络聊天室的登录,注册,聊天室的选择等功能,并支持单人和多人聊天方式,同时也加入了管理员的角色,管理员对聊天室的用户进行管理,包括删除用户和赶出聊天室。
1.1系统功能需求
本系统主要通过客户端,服务器端来体现聊天系统的基本功能。
1.1.1服务器端
1.处理用户注册
2.处理用户登录
3.处理用户发送信息,服务器监控聊天容
4.处理用户得到信息
5.处理用户退出
1.1.2客户端
1.用户注册界面与结果
2.用户登录界面与结果
3.用户发送信息界面与结果
4.用户得到信息界面与结果
5.用户退出界面与结果
1.2模块设计
通过上述需求分析,本系统分为登录与选择聊天室模块,注册模块,聊天模块,管理用户模块,数据库操作模块五大模块,具体描述如表1-1
表1-1聊天系统模块表
模块名
类名
功能描述
数据库操作模块
DBHandler
封装了一下JDBC的API,向本聊天系统提供数据库操作方面的接口。
登录与选择模块
LoginFrame
登陆界面,其中提供权限检测的功能
SelRoomFrame
聊天室选择界面,提供了聊天室选择功能
注册模块
SelRoomFrame
注册界面,提供普通用户注册功能
管理用户模块
ManageFrame
管理用户界面,提供管理员删除用户的功能
聊天模块
ChatFrame
聊天界面,提供用户聊天功能,支持单人聊天,多人聊天,以与管理员赶人的功能
ChatServer
聊天服务器,用来转发,过滤用户的聊天信息,以与向用户发送信息
ChatDialog
供用户输入聊天信息的对话框
Listen
用户监听聊天服务器的线程
在整个聊天系统中里,数据库操作模块提供了相应的数据库接口,比如添加注册用户,删除用户,获取用户的权限等。
登录与聊天室选择模块分成登录和聊天室选择两部分。
登录界面是管理员和普通用户的入口,普通用户可以从登陆界面进入注册界面或者聊天室选择界面,管理员可以聊天室界面或者管理员用户界面。
聊天室选择界面提供了“谈天说地”,“缘分天空”,“休闲娱乐”三个聊天室选择,用户可以任意选择一个进入。
注册模块提供了普通用户的注册功能。
新用户注册需要输入用户名和密码,当系统中有重名时会弹出警告,要求用户重新输入。
管理用户模块提供了删除用户的功能。
管理员可以将普通用户从系统中删除,被删除用户不能登录聊天系统。
聊天模块包含服务器端和客户端两部分。
客户端聊天界面包含聊天在线用户列表以与聊天信息发布区域。
聊天对话框是用户输入聊天信息的地方。
客户端通过启动监听进程。
1.3数据库设计
本聊天系统使用SQLServer2005作为后台支持的数据库,根据需求分析的结果,使用数据库中系统数据库“model”,在此数据库里存放所有关于实现聊天逻辑的数据表。
在“model”数据库中创建名为“userInfo”的表,用来记录用户的注册数据,包括用户名,密码以与用户权限。
其中字段如表2
表1-2userInfo表结构
字段
中文描述
数据类型
是否为空
备注
userID
描述登录信息的ID
int
否
自增长,主键
name
登录用户名
Varchar(50)
否
password
登录密码
Varchar(50)
否
role
用户权限
int
是
0表示管理员
1表示普通用户
第2章详细设计
2.1数据库模块操作
本设计使用的是JDBC连接SQLServer2005数据库,其核心代码如下。
privatestaticConnectiongetConn(){
//数据库的URL
Stringurl="jdbc:
sqlserver:
//localhost:
1433;DatabaseName=model";
try{
Class.forName(".microsoft.sqlserver.jdbc.SQLServerDriver");
Stringname="sa";
Stringpassword="jiajunp";
return(DriverManager.getConnection(url,name,password));
}catch(SQLExceptione){
e.printStackTrace();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
returnnull;
}
上面的代码是通过Class.forName(".microsoft.sqlserver.jdbc.SQLServerDriver")命令载入驱动JDBC的驱动程序,然后通过DriverManager.getConnection函数获取数据库的连接。
其中连接数据库的URL为url="jdbc:
sqlserver:
//localhost:
1433;DatabaseName=model",用户名与密码自己数据库配置是用户名和密码所致的一致。
2.2登录与聊天室选择模块
登录界面是所有用户的入口,包括用户进入聊天室选择界面,用户注册界面的入口,以与为管理员提供的管理用户界面的入口。
聊天室选择界面提供了“谈天说地”,“缘分天空”以与“休闲娱乐”三个可供选择的聊天室,用户每次登录只能选择其中一个聊天室,并且在同一个聊天室中用户只能保持一个连接。
(1)登录界面的实现(LoginFrame.java)。
登录界面中可以进行三种操作:
登录,注册以与管理。
在登录操作时,程序会调用DBHandler.java类的isAuthorized的方法,验证用户是否具有权限。
如果是,则创建SelRoomFrame对象,进入聊天室选择界面。
在注册操作时,程序会创建RegisterFrame对象,进入注册界面。
当管理动作发生后,程序会调用DBHandler.java类的isAdmin方法,判断用户是否为管理员。
如果是,则创建MangeFrame对象,进入管理用户界面。
publicLoginFrame(){
try{
//设置显示外观为本地系统外观。
注意此句需放在初始化所有控件之前。
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exceptione){
e.printStackTrace();
}
initComponents();
}
(2)聊天室选择界面(SelRoomFrame.java)。
在本系统中有三个聊天室可供选择,“谈天说地”,“缘分天空”和“休闲娱乐”。
用户可以选择任意一个聊天室进入。
在聊天室选择界面中,用户可以进行聊天室选择动作,也可以退出回到登陆界面。
当用户选择一个聊天室,并按下“进入”按钮后,将创建一个ChatFrame对象,进入聊天室界面。
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("进入")){
Stringchoice=getSelButton().getText();
if(choice.equals("谈天说地")){
room="谈天说地";
}elseif(choice.equals("缘分天空")){
room="缘分天空";
}else{
//休闲娱乐
room="休闲娱乐";
}
ChatFramechatframe=newChatFrame(name,room,prio);
}
this.dispose();
}
publicAbstractButtongetSelButton(){
Enumeratione=group.getElements();
while(e.hasMoreElements()){
AbstractButtonab=e.nextElement();
if(ab.isSelected())returnab;
}
returnnull;
}
在使用单选按钮时,应该把所有按钮放入一个ButtonGroup里,以保证组的按钮只能有一个被选中。
getButton()函数通过遍历ButtonGroup里所有的按钮,来确定被选中的按钮。
Swing中所有的按钮都实现了AbstractButton接口,因此通过返回AbstractButton接口来提高通用性。
2.3注册模块(RegisterFrame.java)
第一次登录聊天系统可以进行用户注册。
在注册界面中,用户将提供登录所需的用户名和密码信息。
密码将采用两次输入的方法来确认输入无误。
当用户没有输入用户名或没有输入密码或两次输入的密码不一致时,将会有相应的对话框弹出。
用户注册信息将通过调用DBHandler类的regUser方法保存到userInfo表中。
如果数据库操作失败,将会弹出提示失败的对话框,如果注册成功,将返回登陆界面。
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("注册")){
//用户点击“注册”按钮
if(!
(jTextFieldPw1.getText().equals(jTextFieldPw2.getText()))){
JOptionPane.showMessageDialog(this,"密码不一致!
请重新输入");
return;
}
if(jTextFieldPw1.getText().equals("")){
JOptionPane.showMessageDialog(this,"密码不能为空!
");
return;
}
if(jTextFieldName.getText().equals("")){
JOptionPane.showMessageDialog(this,"用户名不能为空!
");
return;
}
intstatus=DBHandler.regUser(jTextFieldName.getText(),
jTextFieldPw1.getText());
if(status==0){
JOptionPane.showMessageDialog(this,"注册成功!
");
f.show();
this.dispose();
}elseif(status==1){
JOptionPane.showMessageDialog(this,"有重名!
");
return;
}else{
JOptionPane.showMessageDialog(this,"数据库操作失败!
");
return;
}
}elseif(e.getActionCommand().equals("退出")){
//用户按下“退出”按钮。
f.show();
this.dispose();
}
}
2.4管理用户模块(MangeFrame.java)
管理模块是只有管理员才能进入的区域,管理员通过管理员模块对整个聊天系统进行管理。
管理员模块提供给管理员的功能主要是从数据库中删除不好的聊天用户。
publicManageFrame(LoginFramef){
loginf=f;
try{
//设置显示外观为本地系统外观。
注意此句需放在初始化所有控件之前。
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(Exceptione){
e.printStackTrace();
}
initComponents();
this.setVisible(true);
}
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("删除")){
String[]selItems=list.getSelectedItems();
if(selItems.length==0){
JOptionPane.showMessageDialog(this,"请选择被删除的人!
");
return;
}
if(JOptionPane.showConfirmDialog(this,"确定要删除么?
","",
JOptionPane.OK_CANCEL_OPTION)==JOptionPane.CANCEL_OPTION){
return;
}
for(inti=0;iif(!
DBHandler.deleteUser(selItems[i])){
JOptionPane.showMessageDialog(this,"删除"+selItems[i]
+"失败");
}else{
list.remove(selItems[i]);
}
}
list.repaint();
}else{
loginf.show();
dispose();
}
}
如果不选择用户,而直接单击“删除”按钮,则会弹出“请选择删除的人!
”的对话框。
管理员可以同时删除多个用户。
在删除用户是会弹出“确定要删除么?
”的对话框。
如果选择“是”,将进行删除操作;如果选择“否”则不删除。
当删除操作失败时,会弹出“失败××失败”的对话框。
2.5聊天模块
聊天模块是整个系统的核心模块,按功能可以分为普通用户聊天和管理员聊天两部分。
普通用户部分实现单人和多人聊天模式,以与防止重复登录功能。
管理员聊天部分除了普通用户聊天功能之外还加入了“踢人”功能。
表2-1聊天系统消息表
类型
格式
传递方向
解释
login
Login:
<房间>:
<用户名>
双向
通知服务器用户登录
namelist
Nmaelist:
<用户名>
服务器到用户
服务器把聊天室在线用户发送给用户
notify
notify:
<用户名>:
<消息容>
服务器到用户
通知指定用户消息
kick
Kick:
<房间>:
<用户名>:
<管理员名>
双向
通知踢人的消息
talk
Talk:
<房间>:
<用户名1>:
<用户名2>:
<消息容>
用户到服务器
用户1向用户2传送信息
quit
Quit:
<房间>:
<用户名>
双向
用户离开聊天室
reload
Reload:
<房间>:
<用户名>:
服务器到用户
服务器通知用户重复登录
聊天模块由聊天室界面(ChatFrame.java),服务器(ChatServer.java),聊天对话框(ChatDialog.java)以与用户监听线程(Listen.java)组成。
2.5.1聊天室界面(ChatFrame.java)
在聊天室界面中,用户可以进行单人和多人聊天。
在聊天室界面初始化的时候会产生一个客户端socket,用来与服务器进行连接。
同时会新建一个监听进程listen来练接服务器端的消息。
当用户按下“聊天”或者“对所有人聊天”按钮后,将弹出聊天输入对话框。
当管理员按下“踢人”按钮后,将向服务器发送kick消息。
在聊天室界面代码中覆盖率processWindowEvent函数,用来处理用户关闭窗口操作。
用户关闭窗口时,向服务器发送quit消息,然后断开socket连接。
部分代码如下:
publicvoidactionPerformed(ActionEvente){
if(e.getActionCommand().equals("聊天")){
//如果“聊天按钮被按下”
if(selList.getSelectedItems().length!
=0){
dialog.input.setText("");
dialog.input.setEditable(true);
dialog.show();
dialog.input.requestFocus();
}else{
JOptionPane.showMessageDialog(this,"请选择聊天对象!
");
return;
}
}
if(e.getActionCommand().equals("对所有人聊天")){
//如果“对所有人聊天”按钮被按下
//选择所有成员
for(inti=0;iselList.select(i);
}
dialog.input.setText("");
dialog.input.setEditable(true);
dialog.show();
dialog.input.requestFocus();
}
if(e.getActionCommand().equals("踢走")){
//处理踢人操作
String[]selItems=selList.getSelectedItems();
if(selItems.length==0){
JOptionPane.showMessageDialog(this,"请选择踢走对象!
");
return;
}
//构造kick消息,格式为kick:
room:
name
StringBuffersbf=newStringBuffer("kick:
"+room+":
");
for(inti=0;iStringkickname=selItems[i];
if(!
kickname.equals(name)){
sbf.append(kickname+",");
}
}
sbf.append(":
"+name);
sendMessage(sbf.toString());
}
}
在聊天室界面初始化的时候会产生一个客户端socket,用来与服务器端进行连接。
同时会新建一个监听进程listen来接收服务器端的消息。
在聊天室界面代码中覆盖了processWindowEvent函数,用来处理用户关闭窗口操作。
用户关闭窗口时,向服务器发送quit消息,然后断开socket连接。
2.5.2聊天室对话框(ChatDialog.java)
聊天室对话框是用户输入聊天信息的地方。
当用户进入聊天室后,系统会产生一个对话框对象。
用户单击“聊天”或者“对所有人聊天”按钮后,对话框将变成可见。
用户输入完聊天信息单击“发送”按钮或者按下回车键后,对话框程序将把聊天消息封装成“Talk:
<房间>:
<用户名1>:
<用户名2>:
<消息容>”的形式,调用聊天室界面的sendTalkMsg函数将聊天消息发送。
部分代码如下:
publicvoidsendTalkMsg(){
String[]selItems=ChatFrame.selList.getSelectedItems();
if(selItems==null||selItems.length==0)
return;
StringBuffersbf=newStringBuffer("talk:
"+ChatFr