聊天室系统.docx
- 文档编号:6108606
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:57
- 大小:337.10KB
聊天室系统.docx
《聊天室系统.docx》由会员分享,可在线阅读,更多相关《聊天室系统.docx(57页珍藏版)》请在冰豆网上搜索。
聊天室系统
聊天室系统
聊天室对于众多网民来说并不陌生,它是网络上大家讨论交流的有效平台。
由于Java强大的Internet网络程序设计功能,很多聊天室服务器端都是采用Java语言进行实现。
本章所要介绍的开发案例就是利用JAVA实现一个简单的聊天室系统的服务器端。
7.1聊天室系统介绍
网络聊天室是典型的网络应用程序,其一般采用客户/服务器结构来完成整个功能的设计,下面将概要讨论网络聊天室系统的设计。
7.1.1客户/服务器模式
一般聊天室采用的是客户/服务器模式,我们熟悉的QQ聊天室就是采用这种结构模式。
它包含了两个完整的应用程序,即客户端程序和服务器端程序,如图4-1所示。
其中,多个客户端程序可以同时与一个服务器进行通信,然后通过服务器的统一处理而完成聊天室各种所需要的功能,如各客户端之间的信息发送和接收。
图7-1ICQ的客户与服务器模式
我们从上可以知道,要实现该通信模式,首先应在服务器和客户端之间定义一套通信协议,并通过创建套接字来建立连接,然后客户与服务器端再在该连接上进行可靠的传输和接收数据。
客户端发出请求,服务器端监听各种请求并对其提供响应服务。
这也即典型的“请求—应答”模式。
7.1.2聊天室功能介绍
聊天室用户功能
Ø用户注册
新用户输入(用户登陆名,真实姓名,呢称,密码与确认密码),如果登陆名没有与系统中已注册的用户登陆名相同,且密码与确认密码一致,则系统报告该用户注册成功,否则提示错误消息。
Ø用户登陆
注册用户输入登陆名与密码,如果与系统中已注册的用户登陆名及密码匹配,则用户登陆成功,否则提示用户不存在或者密码不匹配。
用户登陆成功后,可以选择房间来发言聊天
Ø参数设置(设置服务器IP,端口)
在客户端设置聊天室服务器的参数,主要有IP地址和端口,把参数保存在一个XML文件中,以便客户端重启时能读入设定的参数
Ø进入房间
用户登陆成功后,可以从房间列表中选择某一房间进入,如果该房间的当前聊天室成员数没有超过该房间的限定人数,则系统允许该用户进入,否则提示该房间已满。
如果用户是房间的第1个聊天成员,则该用户是该房间管理员,直到该用户退出该房间,房间管理员有踢人的权力。
在用户进入到聊天房间后,该房间的所有聊天成员都可以看到该用户。
Ø离开房间
用户可随时离开已进入的房间,当用户离开房间后,返回到房间选择窗口。
如果房间管理员离开房间,则把管理权移交给第二个登陆到该房间的用户。
Ø房间管理员踢人
如果聊天房间中某用户破坏房间的聊天气氛,房间管理员可以把该用户剔出该房间,当用户被剔出某房间后,他在10分钟之内(根据服务器参数设置)不能登陆到该房间。
Ø发言
用户在房间中有两种发言方式:
对房间的所有成员发言(所有成员都会收到该发言消息),对某个成员发言(只有指定成员才能收到该发言消息)
Ø刷新房间列表
在房间选择窗口中,系统自动刷新房间信息,房间信息包含(房间名称,当前成员数量)
Ø用户退出系统
Web管理功能
Ø管理员登陆
Ø修改管理员密码
Ø管理员退出
Ø增加聊天房间
聊天房间属性:
房间名称,最大聊天成员数。
在客户端出现的房间都是用此功能配置出来的
Ø删除聊天房间
Ø注册用户浏览
Ø系统参数设置
参数有:
端口,房间刷新时间间隔,被踢用户的重新进入房间的时间间隔。
7.1.3聊天室系统实现
本聊天室的实现参照了QQ聊天室系统的设计方法,为了更好的测试Java语言编写的网络程序功能的正确性和通用性,我们用如下方法开发了整个聊天室系统。
1. 利用MicrosoftvisualC++6.0实现聊天室的客户端。
2.利用Java实现聊天室的服务器端。
3.利用JSP设计并实现一个聊天室系统管理页面。
可以看出本章案例是一个集成各种相关技术的综合实例,我们也可以从中得出一些关于综合技术开发的经验。
本章将专注于介绍利用Java实现聊天室的服务器端以及利用JSP的相关技术开发出简单实用的聊天室Web管理系统,而关于VC++6.0实现的客户端,本书将提供源代码,具体实现细节可以参照其它相关书籍,在此不再讲述。
在开始聊天室系统设计实现之前,我们有必要对JAVA的网络编程方法有个大致的了解。
7.2节将比较详细的介绍Java所提供用于访问网络资源的类,从而读者入手聊天室将会更加容易。
7.2JAVA网络编程基础
Java语言非常适合用于分布计算环境,这主要体现在它强大的Internet网络程序设计功能。
下面主要讨论java语言所提供的包,其包含了大部分用于访问网络资源的类。
7.2.1Socket类
利用Java来编写网络应用程序,其中最核心的就是Socket类。
它是构造网络程序模块的基础,利用它我们能够很方便的实现程序间双向的面向连接的通信。
但是同一个套接字不能与两台以上的计算机通讯,当需要多个客户端进行通信的时候,我们必须建立多个Socket套接字来完成通讯。
Socket类的构造函数一般有四种方式。
表7-1Socket类的构造函数
构造函数
抛出异常
说明
Socket(Stringhost,intport)
UnknownHostException,
IOException
建立连接到特定主机和端口的套接字
Socket(InetAddressaddress,intport)
IOException
建立连接到指定的IP地址和端口的套接字
Socket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)
IOException
建立连接到特定主机和端口的套接字,并它绑定到特定的本地地址和本地端口
Socket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)
IOException
建立连接到指定的IP地址和端口的套接字,并把它绑定到特定的本地地址和本地端口
其中,各构造函数的参数解释如下:
Stringhost——要进行连接的主机名
intport——主机的监听端口
InetAddressaddress——主机的IP地址
InetAddresslocalAddr——套接字所绑定的本地地址
intlocalPort——套接字所绑定的本地端口
下面介绍Socket类一些常用的方法:
1.PublicInetAddressgetInetAddress()
//返回连接到套接字的远程主机的InetAddress对象。
2.PublicInetAddressgetLocalAddress()
//返回与套接字关联的本地InetAddress对象。
3.PublicintgetPort()
//返回套接字连接到的远程服务的端口号。
4.PublicintgetLocalPort()
//返回该套接字绑定在本地计算机上的端口号。
5.InputStreamgetInputStream()产生java.io.IOException异常
//返回一个输入流,它从该套接字连接到的应用程序读取信息。
6.OutputStreamgetOutputStream()产生java.io.IOException异常
//返回一个输出流,它向套接字连接到的应用程序写入信息。
7.voidclose()产生java.io.IOException异常
//关闭套接字连接。
下面讨论如何通过socket类来编写客户端程序。
其基本流程为:
1.通过上述的Socket构造函数,用服务器所在机器的ip以及服务器的端口作为参数创建一个Socket对象
2.利用Socket类提供的getInputStream和getOutputStream方法来创建输入输出流。
3.使用输入输出流对象相应的方法来完成客户端与服务器端的开发
7.2.2DatagramSocket和DatagramPacket类
DatagramSocket是一种面向无连接的数据报socket。
由于不能建立连接,数据报服务不能保证所有的数据都能准确有序的到达目的地,但它的速度比有连接协议快,而且像聊天室这种网络应用程序对可靠性要求不是很高,故其也用的非常普遍。
本聊天室就是利用该类来发送和接收数据。
⏹接收数据报
同Socket连接类似,数据报的接收也需要一个DatagramSocket类用来监听本地主机上的指定端口,当有数据接收时创建一个DatagramPacket对象实例,调用DatagramSocket的receive方法来接收数据,这一过程可以重复进行。
在其它编程语言中也有类似的过程。
下面给出Java接收数据报典型的程序片断。
//为接收数据报分配缓冲区
Byte[]buffer=newbyte[500];
//为接收数据报实例化DatagramPacket和DatagramSocket
DatagramPacketdatagramPacket=newDatagramPacket(buffer,buffer.length);
DatagramSocketdatagramSocket=newDatagramSocket(8000);
//接收数据处理
While(true)//无限循环
{
datagramSocket.recieve(datagramPacket);
Strings=newString(buffer,0,0,packet.getLength());
}
⏹发送数据报
发送数据报首先创建DatagramPacket实例,指定其所发送的数据缓冲区、数据长度、目的地主机名和端口号,然后再使用DatagramSocket的send()方法来发送。
下面给出Java发送数据报典型的程序片断。
//为发送数据报分配缓冲区
Byte[]buffer=newbyte[500];
//为发送数据报实例化DatagramPacket和DatagramSocket
DatagramPacketdatagramPacket=newDatagramPacket(buffer,buffer.length,address,8000);
DatagramSocketdatagramSocket=newDatagramSocket();
//发送
datagramSocket.send(datagramPacket)
7.3聊天室系统设计
7.3.1系统建模
对聊天室的分析我们可以明确系统主要有两类角色(Actor)及其相关的用例:
●系统管理员:
系统管理员维护聊天室系统的所有信息,包括用户管理、聊天室房间管理、配置服务器参数等。
●普通用户:
普通可以使用系统进行各种聊天室服务,包括:
注册用户名、登陆服务器、聊天室发言、房间管理员踢人、退出聊天室系统等。
根据前面的用例分析,我们得到了聊天室系统的用例(UseCase)图。
首先我们看到的是整个系统的用例图,如图8-2所示。
图7-2系统的总体用例图
从用例图中我们可以看到:
系统的两类角色的功能分布比较平均。
普通用户是整个系统的被动使用者,他们只能使用聊天室系统的正常功能,而不参与系统的管理和维护。
管理员则负责整个系统的管理和维护。
为了增加系统的灵活性,管理员还可以也可以参与到聊天室聊天,维护聊天室的管理。
另外,管理员还需要维护系统的数据库文件,例如进行备份、加密等方面的工作。
下面是对本系统中涉及到的主要用例的一些简单介绍:
1.登陆/退出系统:
本用例描述了管理员和普通用户如何登陆和退出本系统,登陆时要注意的事项,本系统所有用户都应启用各自的登陆/退出用例。
2.管理员帐户管理:
本用例描述了系统管理员如何进行管理员的帐户管理。
本用例可以进一步细化为:
密码的维护与管理,管理员的增加和删除等。
3.聊天室房间管理:
本用例描述系统管理员如何维护聊天室系统的房间管理。
本用例可以进一步细化为:
添加删除聊天室,修改聊天室属性如房间名称,最大聊天成员室。
4.系统参数管理:
本用例主要是描述系统管理员如何管理和配置各种系统参数。
本用例可以进一步细分为:
服务器服务端口、房间刷新时间、被踢用户重新进入房间的时间间隔。
5.用户注册:
本用例是描述教师如何在该聊天室系统中进行用户注册。
本用例可以进一步细分为填写注册信息、打包注册信息并发送注册请求、结果显示。
6.进入/离开房间:
本用例描述如何向系统提交用户进入或者离开房间请求以及系统如何响应该请求。
需要指出的是进入房间请求需要用户满足一定的条件:
聊天室现有成员没有超过限定数量而且用户如果被房间管理员踢出的间隔时间要大于预定值。
而退出房间则比较自由。
7.发言:
本用例描述了用户如何使用聊天室系统进行各种信息的发送,它是系统中最核心的用例。
本用例可以进一步细分为公共发言和私聊发言。
8.房间管理员踢人:
本用例描述了房间管理员如何使用本系统完成踢人的功能。
需要指出的是,该功能只有房间管理员才具备,其定为第一个进入该聊天室房间的成员。
7.3.2聊天室系统的系统设计
为了更加详细地介绍本系统中各个用例的工作过程,接下来我们给出本系统中关键用例的UML时序图。
时序图反映了各用例的工作流程,以及工作过程中系统各层次间的协作关系,这对编码实现非常重要。
1.普通用户登陆/退出系统
用户发送登陆请求,客户端获取用户登陆信息发送到服务器端,服务器启动用户登陆管理线程,获取用户名和密码进行登陆验证,将验证结果返回给客户端显示。
图7-4普通用户登陆/退出时序图
说明:
系统的所有用户都必须经过登陆之后才能使用系统所提供的功能,不登陆则不能使用。
若没有用户名,则必须通过注册获取用户帐户。
2.管理员帐户管理
管理员登陆后可以发送帐户管理请求,进入帐户管理页面,获取帐户维护信息,验证帐户的合法性(包括唯一性,字符数不超过限定数量等),操作数据库进行相应的更新,最后将结果返回给管理员用户。
图7-5管理员帐户管理时序图
说明:
管理员帐户管理在进行密码修改时为了增加系统的安全性,需要管理员再次输入密码,若不能验证则将不会修改密码。
3.聊天室房间管理
聊天室房间管理是整个系统管理维护的核心内容之一。
管理员发送请求,聊天室管理系统首先调用数据库获取房间信息列表,管理员可以选择添加或者删除房间,并设置其各种参数,系统首先进行合法性检测,合法以后再更新数据库文件,否则报错,所有的反馈信息将在结果也没进行显示。
图7-6聊天室房间管理时序图
4.系统参数管理
管理员登陆后可以系统参数管理请求,进入系统参数配置页面,系统首先读取数据库显示现有配置方案,管理员可以其各种参数进行修改提交,系统获取新的配置信息,操作数据库进行相应的更新,最后将结果返回给管理员用户。
图7-7系统参数管理时序图
说明:
由于本系统没有采用实时读取系统参数的方式,所有更新完系统参数后需要重新启动聊天室系统服务器程序后才能生效。
5.用户注册
用户头次进入聊天室时需要进行用户注册才能登陆聊天室聊天。
注册流程如下:
用户提出注册请求,客户端响应弹出注册信息对话框,用户输入相关信息并提交,客户端首先进行合法检查,确定无误后将数据信息发送服务器端。
服务器接受到请求,启动单独的线程进行处理,首先进行合法性检查,确认登陆名没有与系统中已注册的用户登陆名相同后更新数据库,并返回信息,客户端进行显示。
图7-8用户注册时序图
6.进入房间
用户可以选择不同的房间进入。
进入房间流程如下:
用户客户端提出进入房间请求,将进入房间的信息发送到服务器端,服务器端首先检查房间是否已满,若满则拒绝,否则再检查用户的合法性,若确定无误,则更新房间信息,并将结果返回给用户。
图7-9进入房间时序图
7.发言
发言是聊天室的核心功能。
用户提出发言请求,客户端接受发言的内容和其它各种设置(公聊或私聊),打包发给服务器端。
服务器接收请求后确定聊天方式,若为公聊则将消息发送到每个用户,若为私聊,则将消息发送到指定的用户。
服务结果最后显示在客户端。
图7-10发言时序图
8.房间管理员踢人
只有房间管理员才具有踢人的功能。
流程如下:
房间管理员提出踢人要求,客户端将用户名和踢人请求打包发送给服务器,服务器获取求情首先验证管理员的身份,确定具有权限则执行踢人动作,将所踢用户退出该房间,并更新房间信息,将结果返回给客户端。
图7-11房间管理员踢人时序图
上面即为整个聊天室系统的概要设计,进一步的细化、详细接口描述限于篇幅请读者自行完成。
7.4设计数据库
数据库在信息管理系统中占有非常重要的地位,其设计的好坏直接影响到整个系统的效率和性能。
设计数据库系统时,首先要完成系统的需求分析,包括现有的以及将来可能添加的需求,从而使整个系统具有很好的可扩展性。
本小节数据库设计将按照以下几个步骤进行:
●数据库需求分析
●数据库概念设计
●数据库逻辑结构设计
7.4.1数据库需求分析
用户的需求具体体现在各种信息的提供、保存、更新和查询。
这就要求数据库结构能够充分的满足各种信息的输入和输出。
收集基本数据、数据结构以及数据处理流程,组成一份详细的数据字典,为下一步的具体设计做好充分的准备。
仔细分析聊天室系统的需求,可以得到如图8-12所示的系统要处理的数据流程图。
图7-12聊天室系统数据流程图
值得注意的是,考虑到数据库的规模,聊天室的发言内容将不存储在数据库中。
通过对聊天室系统工作过程的内容和数据流程分析,设以下的数据项和数据结构:
●用户信息,包括的数据项有:
用户名、昵称、性别、用户提示问题、回答答案、用户邮箱、用户头像、教育水平等。
●房间信息,包括的数据项有:
房间名、房间所能容纳的最大成员数、房间编号
●系统参数配置信息,包括的数据项有:
端口号、刷新时间、被踢重新进入房间的限制时间。
●管理员信息,包括的数据项有:
管理员帐号,密码等。
有了上面的数据字典和数据流程,我们就可以对其进行进一步的概念结构设计。
7.4.2数据库概念分析
得到上面的数据项和数据结构以后,就可以设计出能够满足用户需求的各种实体以及它们之间的关系,为以后的逻辑结构设计打下基础。
这些实体包括各种信息,通过相互之间的作用形成数据的流动。
我们根据上面的需求分析设计的实体有:
用户信息实体、房间信息实体、系统参数实体、管理员实体。
各个实体具体的E-R图如下文。
用户信息实体E-R图如图8-13所示。
图7-13用户信息实体E-R图
房间信息实体E-R图如图7-14所示。
图7-14房间信息实体E-R图
系统参数配置实体E-R图如图8-15所示。
图7-15系统参数配置实体E-R图
管理员实体E-R图如图7-16所示。
图8-16管理员实体E-R图
7.4.3数据库逻辑结构设计
现在需要将上面的数据库概念设计E-R图转化为能被实际数据库系统所支持的实际数据模型,这就是数据库的逻辑设计。
聊天室系统各个表格的设计结果如下面的表格所示。
其中每个表格即表示数据库中的一个表。
本系统采用Access数据库作为服务器。
表7-1用户信息表(user_info)
字段名称
类型
可否为空
长度
说明
user_name
varchar
否
20
用户名(主键)
user_nickname
varchar
否
20
用户昵称
user_pwd
varchar
否
20
密码
user_sex
varchar
否
2
性别
user_problem
varchar
是
20
提问
user_answer
varchar
是
20
回答
user_email
varchar
是
20
用户邮箱地址
user_map
varchar
否
10
用户头像
user_edu
varchar
是
10
用户教育程度
表7-2房间信息表(room_info)
字段名称
类型
可否为空
长度
说明
room_name
varchar
否
20
房间名(主键)
room_max_member
int
否
自动
最大容纳成员数
Room_id
long
否
自动
房间编号
表7-3系统参数配置表(chat_attribute)
字段名称
类型
可否为空
长度
说明
port
varchar
否
20
端口号
refreshtime
varchar
否
20
刷新时间
reintime
varchar
否
10
被踢重新进入房间限定时间
表7-4管理员表(admin_info)
字段名称
类型
可否为空
长度
说明
admin_name
varchar
否
15
管理员帐号
admin_pwd
varchar
否
15
密码
7.5设计用户界面
界面是人机交互的窗口。
用户界面接收用户的输入信息,并将程序执行的结果向用户输出。
良好的用户界面能够提升用户的工作效率,使系统获得更好的肯定。
根据用例可以制定出用户界面,包括:
用户界面的功能、与用户交互的信息,以及用户界面之间的切换关系等。
对于本聊天室,界面主要由三大块组成:
●客户端界面
●服务器界面
●Web端管理界面
下面分别进行介绍。
7.5.1客户端界面
客户端主要完成与服务器的连接和各种数据的传送,为聊天室用户提供良好的人机界面。
界面设计如下:
用户要进入聊天室必须首先经过登陆。
聊天室的登陆界面如图7-17所示。
用户必须指定用户名,输入密码,以及服务器的地址以及端口。
图7-17客户端登陆界面
若用户通过服务器验证,登陆成功,将出现选择房间界面,如图7-18所示。
图7-18客户端选择房间界面
点选自己感兴趣的房间,将进入主聊天界面,如图7-19所示。
图7-19客户端主聊天界面
7.5.2服务器界面
Java服务器主要提供各种聊天室服务,包括数据转发,用户信息维护,房间信息维护,其界面主要是提供启动服务的功能,而其中各种管理则有Web管理页面进行承担,如图7-20所示。
图7-20Java服务器端界面
7.5.3聊天室Web管理界面
聊天室的Web管理主要是提供通过网络对数据库进行修改的功能,故管理员进行聊天室维护时首先必须进行登陆,其界面如图7-21所示。
图7-21Web管理登陆页面
管理员登陆通过验证以后,即可进行房间信息管理,用户信息管理,系统参数配置等。
房间管理页面见图7-22,而用户的管理页面见图7-23。
图7-22Web房间管理页面
图7-23Web用户管理页面
7.6服务器端设计实现
7.6.1系统通讯包设计
通讯协议的设计是聊天室程序的一个重要内容,好的通讯协议将使程序有很好的可扩展行和可维护性。
本聊天室的通讯包设计如表8-5所示。
表7-5聊天室通讯包设计表
通讯包名称
端属性
格式
登陆包
客户端
1@name@pwd
回答登陆包
服务器端
登陆成功:
21@1
登陆失败:
21@0
注册包
客户端
2@name@nickname@pwd@email@map@e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 聊天室 系统