ASP + SQL Server聊天室设计实例
目 录
第一章:绪论
1.1 设计思想
1.2 开发工具和相关技术简介
第二章:聊天室总体分析和设计
2.1 聊天室的运行原理
2.2 聊天室的功能
2.3 聊天室的页面结构设计
2.4 聊天室的程序结构设计
2.5 数据库结构设计
第三章:聊天室的详细设计
1. 变量说明
2. 聊天室的核心引擎(全局聊天消息分发引擎)设计
3. 用户客户端聊天信息输入与发送模块设计
4. 用户客户端全局聊天信息接收与显示模块设计
5. 全局聊天消息缓冲
6. 实例聊天室列表
7. 聊天室在线用户列表
8. 表情图释索引表
9. 聊天用户个人信息保存模块
10. 聊天室显示面板属性个性化设置模块
10.1聊天对象选择功能
10.2聊天者名字修改功能
10.3公聊私聊模式切换功能
10.4文字背景色前景色设置功能
10.5聊天面板屏幕显示字体设置
10.6自动滚屏设置功能
11. 登陆聊天室模块
12. 退出聊天室模块
第四章:聊天室运行环境构架与说明
4.1 运行环境要求
4.2 运行环境构建
4.3 聊天流程说明
第五章:参考文献
附录:聊天室源代码
第一章 绪论
在Internet(互连网)飞速发展的今天,上网成为越来越多人们的选择。有关的网络技术也层出不穷。现今活跃在WEB站点中的ASP就是近年才发展起来的一项新型技术。ASP功能强大、本领高强,利用ASP功能时几乎没有什么限制,可以实现动态页面。本文主要介绍了ASP技术相关的基础知识,并探讨了利用ASP + SQL server建立聊天室的设计思想、方法及设计过程,详细地分析了各个模块的功能及实现方法。本文所实现的聊天室具有良好的程序结构和人机交互界面,通用性强,可应用于不同需求的网站。
1.1设计思想
在互联网上,传统的网站或用户都使用类似于Email(电子邮件)的形式互相发送信息来进行一系列的交流.但这种异步交互的办事效率可见是很低的.为提高效率,让用户之间能达到实时交互的目的,所以出现了可以实时交流信息的聊天室,来满足用户的需求.
1.2开发工具和相关技术简介
1.2.1ASP简介
Active Server Pages (ASP)是服务器端的脚本编写环境,可用它来创建动态Web页或生成功能强大的Web应用程序。ASP页是包括HTML标记、文本和脚本命令的文件。ASP页可调用ActiveX组件来执行任务,例如连接到数据库或进行商务计算。通过ASP,可为您的Web页添加交互内容或用HTML页构成整个Web应用程序,这些应用程序使用HTML页作为您的客户的界面。
ASP的特点:
ASP可以和HTML或其它脚本语言(VBScript,JavaScript)相互嵌套
ASP是一种在WEB服务器端运行的脚本语言,程序代码安全保密
ASP以对象为基础,因此可以使用ActiveX控件继续扩充其功能
ASP内置ADO组件,因此可以轻松的存取各种数据库
ASP可以将运行结果以HTML的格式传送至客户端浏览器,因而可以适用与各种浏览器
制作本聊天室,服务器端我们使用的是VBScript脚本,客户端我们使用功能强大的javascript脚本实现BS交互.
1.2.2SQL server 2000简介
SQL Server 2000是一个杰出的数据库平台,可用于大型联机事务处理数据仓库以及电子商务等,特别是对XML,HTTP 的支持,以及在WEB ,数据仓库服务中的应用,而且存取运行速度远远高于 Access 等小型数据库. 所以很适合用于实时性要求比较高的应用程序, 本聊天室因为实时性要求比较高,所以使用SQL server2000 作为数据库,以获得高效的性能.
1.2.3 JavaScript简介
Java Script是由Sun公司及网景Netscape公司开发的。它可以让你设计交互的网页内容,但不能单独执行,必须在浏览器或服务器上执行。本文就是他在客户浏览器上的应用.
1.2.4 DHTML(动态HTML) 简介
传统的HTML是静态的,当它被加载到浏览器后,它只像一个画面,怎么看也不会发生变化,而动态HTML则意味着Web页面对用户有响应,即,动态HTML能自动变化。
1.2.5 Cookie 技术简介
Cookies是为了弥补HTML的一个缺陷而产生的。HTML是一种无记忆的协议,也就是说用户目前正在浏览的主页对在此之前浏览过的主页没有丝毫记忆和了解。而实际的需要可能是希望浏览器能够记住一些信息,而这些信息却不希望让使用者看到,比如说可能是一些用户的身份信息,因此这些信息是不能以参数的形式传送的。这个需求由HTML本身无法解决,于是引入了Cookies的概念,也就是由WebServer向浏览器写入一些信息,这些信息用户无法看到,当浏览器网站的其他主页发出GET请求时把此Cookies信息也会发送过去,供该主页使用,这样就实现了一定程度上的HTML的记忆能力。
本聊天室就是利用Cookie来存取一些用户的个人配置信息,以减轻服务器运行负担。
第二章聊天室总体分析和设计
2.1 聊天室运行原理
聊天室最基本的原理就是: 从客户端收集消息,然后 通过服务器端消息分发程序中转,将全局消息发送给的所有用户. 其原理图如下:
用户1 (聊天客户端IE) |
发送聊天消息 |
用户2 (聊天客户端IE) |
发送聊天消息 |
接收全局聊天消息 |
接收全局聊天消息 |
聊天服务器
消息分发引擎 |
用户3 (聊天客户端IE) |
用户4 (聊天客户端IE) |
发送聊天消息 |
发送聊天消息 |
接收全局聊天消息 |
接收全局聊天消息 |
图(1)
2.2聊天室的功能
聊天室支持公聊、私聊、每个用户都有代表自己的昵称,可在用户在线列表中选择聊天对象。聊天消息中可插入表情图释,采用主动刷新机制,确保不会掉线。精心设计的消息分发引擎,在没有新信息的时候主窗口看不到刷新,尽可能的减小服务器负担。用户类型分成:游客(性别未知),美女和帅哥3种。且每个用户在一台电脑上只能进一个聊天室。
2.3聊天室的页面结构设计
本聊天室分为4块区域,即公聊区,私聊区,聊天面板,用户列表。采用框架形式的页面结构,以便在一个IE窗口中显示多个WEB页面,使之构成一个完整实用的聊天室界面。
如图所示:
图(2)
由以下几个asp文件组成此界面:
chat.asp :由框架组成分别包含: chatboard, singlechat, userlist, controlboard几个框架(Frame).
chatboard.asp :公聊区页面
singlechat.asp :私聊区页面
controlboard.asp :控制版
userlist.asp :用户列表
2.4聊天室的程序结构设计
本聊天室为了尽可能达到通用性,所有将聊天室抽象成一个聊天室模块!只要设置不同的聊天室名字,就可以建立独立的聊天室。应用于网站时,可以由网站管理员建立,也可以让用户自己建立。
下面介绍一下组成本聊天室的11个功能模块
13. 聊天室的核心引擎:全局聊天消息分发引擎
14. 用户客户端聊天信息输入与发送模块
15. 用户客户端全局聊天信息接收与显示模块
16. 全局聊天消息缓冲
17. 实例聊天室列表
18. 聊天室在线用户列表
19. 表情图释索引表
20. 聊天用户个人信息保存模块
21. 聊天室显示属性个性化设置模块
22. 登陆聊天室模块
23. 退出聊天室模块
以下是本聊天室的程序组成结构图:
为用户分配资源 释放该用户的资源
登陆模块 |
发出登陆请求 发出退出请求
聊天用户个人信息保存模块 |
聊天室显示属性个性化设置模块 |
服务器端 聊天信息接收分发引擎 |
客户端 聊天信息输入与发送模块 |
全局聊天消息缓冲 |
实例聊天室列表 |
表情图释索引表 |
全局聊天信息接收与显示模块息保存模块 |
聊天室在线用户列表 |
局部模块 |
退出模块 |
全局模块 |
图(3)
2.5数据库结构设计
本聊天室中的2个模块的数据是存放在数据库中的。1个是在线用户的列表模块,另一个是实例聊天室列表模块。
2.5.1 实例聊天室列表模块
1. 表名:ChatRoomlist
2. 结构:
字段名 字段类型 字段字节数
id int 4 (记录唯一表示ID)
Roomname varchar 50 (实例聊天室名字)
creater varchar 50 (聊天室的建立者)
createtime smalldatetime 4 (建立时间)
state varchar 10 (聊天室状态,包括:开启和关闭)
memo varchar 100 (备注)
2.5.2 在线用户的列表模块表结构
1.表名: ChatRoomUser
2.结构
字段名 字段类型 字段字节数
id int 4 (记录唯一表示ID)
nickname varchar 50 (用户昵称)
sex varchar 10 (用户性别)
logintime smalldatetime 4 (登陆聊天室的时间)
RoomAppNamevarchar 50 (当前所在聊天室的程序内部名字)
TrueRoomName varchar 50 (当前所在聊天室的实例名字)
JoinIP varchar 50 (用户进入聊天室时所用的IP)
SessionID varchar 50 (用户进入聊天室时,服务器分配个用户
的SessionID(用户唯一表示ID))
第 三 章 聊天室的详细设计
3.1 变量说明
l 服务器端全局变量
在ASP中,全局变量是通过Application对象保存的,他从Web服务器启动开始到关闭之前一直存在,所以可以被程序共享访问
在我们的聊天室里使用了以下这些变量
1. application(RoomAppName) (保存信息高速缓冲, RoomAppName是一个抽象变量,根据不同的聊天室,设置不同的高速缓冲)
2. application(RoomAppName &"_MsgHeadPointer") '消息缓冲环结构中的头指针[这里用数组下标标识]
3. application(RoomAppName &"_MsgTailPointer") '消息缓冲环结构中尾指针[这里用数组下标标识]
4. application(RoomAppName &"_Msg_ID") '消息缓冲中标识消息记录唯一的递增变量
5. application("Faces") ‘图释索引列表,用于图释选择和定位
l 服务器端局部变量
ASP里有3种局部变量: 1.页面使用的变量
2.用户从本网站开始到离开期间使用的变量
3.保存在每个用户客户端的变量
ü 页面使用的变量
1. RoomId :标识聊天室的唯一ID
2. chatUsername :在聊天室里用的用户昵称
3. UserSex :用户性别
4. RoomAppName :用于标识各个聊天室的唯一名字,由字符串"ChatRoom_"和RoomID拼接而成
ü 用户从本网站开始到离开期间使用的变量(使用session对象实现)
1. session.Contents("Pass")
布尔变量,在用户退出聊天室时,用于用户的合法性判断
2. session("RoomAppName")
保存当前用户所在的聊天室唯一标识名
3. session("ChatNickName")
保存当前用户在聊天室里的昵称
4. session("UserSex")
保存当前用户的性别
ü 保存在每个用户客户端的变量(使用Cookie技术实现)
1. response.Cookies(RoomAppName)("ChatNickName")
当前用户在聊天室里的昵称
2. response.Cookies(RoomAppName)("ChatRoomTrueName")
当前用户所在的聊天室真正的名字(可以重复)
3. response.Cookies(RoomAppName)("ChatRoomAppName")
当前用户所在的聊天室唯一标识名
4. response.Cookies(RoomAppName)("MsgLastLinePointer") 标识用户从消息缓冲中接收的最后一条信息的消息id,用于判断用户客户端消息的更新
l 客户端局部变量
本聊天室在客户端使用了一些变量来保存和判别每个用户在聊天室中的个性化设置和聊天信息的接收和显示(都是javascript在客户断定义的变量和数组)
1. FontBold :聊天内容显示字体是否为粗体
2. FontItalic :聊天内容显示字体是否为斜体
3. PrivateChat :聊天模式是否为私聊模式
4. SpliteScreen :聊天内容显示方式是否分屏
5. ScrollSreen :聊天内容显示时是否自动滚屏
6. FrontColor :聊天内容显示字体的前景色
7. BackColor :聊天内容显示字体的背景色
8. selfname :用户自己的昵称
9. TalkerArray :接收更新消息时保存说话者字段的1维数组
10. TalkToArray :接收更新消息时保存说话对象字段的1维数组
11. MsgArray :接收更新消息时聊天内容字段的1维数组
12. SaytimeArray :接收更新消息时说话时间字段的1维数组
l 系统常数
1. RoomMaxUser :每个聊天室的最大用户数
2. MaxMsgLines :消息高速缓冲数组矩阵的最大行数,
3. MaxMsgColumn :消息高速缓冲数组矩阵的最大列数
4. MaxFaces :图释列表的最大图释个数
5. FacePath :图释文件的相对存放路径
3.2 聊天室的核心引擎(全局聊天消息分发引擎)设计
首先,我们介绍一下使聊天室正常运转的核心引擎―――全局聊天消息分发引擎。他就像人的心脏运送血液那样,在聊天系统中运送着用户的信息,使整个聊天交互过程得以正常运转。
l 功能说明:接收用户发送到服务器的聊天信息,向用户发送在聊天室中参与聊天的所有用户的全局聊天信息。
l 接收发送模式:客户端主动模式
l 引擎组成构造:
本引擎由2个asp脚本文件:
接收数据脚本文件(receivedengine.asp)和发送数据脚本文件(Refreshengine.asp)
再通过一个全局信息高速缓冲做为共享数据区,实现从客户端获取个人消息并发送全局消息。
l 引擎原理图
全局消息高速缓冲 信息1 信息2 信息3 . . . |
用户 |
用户 |
数据接收接口 |
数据发送接口 |
用户 |
用户 |
图(4)
l 核心算法与重点代码的设计
u全局信息高速缓冲的实现
我们用一个二维数组构成一张二维表,缓冲聊天内容,其行存储某一用户对另一个用户的一条聊天记录,其列存储记录中的各个字段.
其表结构如下:
高速缓冲二维表
标识记录唯一ID | 说话者 | 说话对象 | 聊天内容 | 说话的时间 | 聊天方式 |
1 | XX | OO | Hi | 2004-05-27 | On(私聊) |
2 | YY | KK | 你好 | 2004-05-28 | Off(公聊) |
… | … | … | …. | … | … |
在这里我们使用循环列队(环)这种数据结构形式实现高速缓冲的运转(如图5所示),此线性表首尾相接,由2个指针互相协调控制,一个称为front(列队头,在这里我们使用Headpointer标识),另一个称为rear(列队尾,在这里我们使用Tailpointer标识);
图5 (循环列队)
a:初始状态 b:添加数据 c:删除数据
其控制变量有: MsgHeadPointer、MsgTailPointer、Msg_ID(变量说明见3.1)
其操作包括:
1. 创建一个空的缓冲
CreateCache(MaxLines , MaxColumn , RoomAppName)
2. 初始化一个缓冲
Init_Cache(cache , MaxLines , MaxColumn , RoomAppName)
3. 如果缓冲为空,则返回TRUE,否则返回FALSE
Cache _Is_Empty(cache , RoomAppName)
4. 向队列中添加一条聊天记录
AddToCache(cache , MaxLines , RoomAppName , Talker, TalkTo , Msg , ChatMethod)
5. 获取缓冲中新的全局聊天消息
GetNewestMsg(cache , MaxLines , RoomAppName )
具体函数程序,请参考附录!
由于高速缓冲在整个聊天系统运行中是非常重要的共享数据区,所以我们使用Application对象保存高速缓冲数组.
u数据接收实现
数据接收模块,接收用户从客户端通过表单提交上来的聊天信息,然后把他添加进高速缓冲.主要利用ASP的Request对象截获表单数据,具体程序如下:
‘用户输入聊天内容并发送到服务器端
略………在3.3详细介绍
‘-获取用户提交上来的信息
RoomAppName = request("RoomAppName") ‘发送到目的聊天室的唯一标识名
Talker = request("Talker") ‘说话者
TalkTo = request("TalkTo") ‘说话对象
Msg = Server.HTMLEncode(request("chatmsgbox")) ‘聊天内容
ChatMethod = request("private") '公聊=off或私聊=on
‘加入当前用户信息到高速缓冲(MaxLines是系统常数参考3.1)
1. AddToCache(cache , MaxLines , RoomAppName , Talker, TalkTo , Msg , ChatMethod)
u数据发送实现
数据发送模块,由客户端浏览器每隔5秒钟,主动刷新服务器端的数据发送页面,发送程序把当前用户的所需的全局聊天信息从高速缓冲中取出并发送给客户端.主要应用了ASP的Request和Cookie技术获取当前用户的在聊天室中的系统状态信息,来判断发送的信息内容,应用Application对象从高速缓冲中读取信息.具体程序如下:
RoomAppName = request("RoomName") ‘获取更新信息的目的聊天室的唯一标识名
'-----------------获取用户信息(变量说明请参考3.1)-----------------------
ChatNickName = request.Cookies(RoomAppName)("ChatNickName")
ChatRoomTrueName = request.Cookies(RoomAppName)("ChatRoomTrueName")
ChatRoomAppName = request.Cookies(RoomAppName)("ChatRoomAppName")
MsgLastLinePos = CLng(request.Cookies(RoomAppName)("MsgLastLinePointer"))
'--------------------------------------------------------------------------------
‘发送数据给客户端
’获得程序生成的需更新记录的javascript消息数组
TheNewstMsg = GetNewestMsg(application(RoomAppName),MaxMsgLines,RoomAppName )
‘显示新的全局聊天信息到客户端
略………在3.4详细介绍
3.3 用户客户端聊天信息输入与发送模块设计
l 功能说明:此模块用于用户输入聊天内容,并发送到聊天室里,即实现在聊天室中发言的功能
l 操作流程图:
用户输入聊天内容 |
按回车键或者发送按钮 |
客户端发送程序
|
服务器端接收提交信息并处理 |
l 代码的设计:
3.4 用户客户端全局聊天信息接收与显示模块设计
3.5 全局聊天消息高速缓冲
3.6 实例聊天室列表
3.7 聊天室在线用户列表
3.8 表情图释索引表
3.9 聊天用户个人信息保存模块
3.10 聊天室显示面板属性个性化设置模块
3.10.1 聊天对象选择功能
3.10.1 聊天者名字修改功能
3.10.1 公聊私聊模式切换功能
3.10.1 文字背景色前景色设置功能
3.10.1 聊天面板屏幕显示字体设置
3.10.1 自动滚屏设置功能
3.11 登陆聊天室模块
3.12 退出聊天室模块