在主页上拥有一个聊天室,会给你的主页空间增添许多情趣,特别是在 Intranet 或局域网内更是乐趣无穷。然而传统的CGI编程是一件头疼的事,随着 ASP技术的流行,制作主页聊天室不再是件可怕的事情。跟我一步步的来吧,拥有你自己的聊天室空间。
一、主页聊天室的原理
1、主页聊天室其实并不神秘,名成员间相互通信的方式并非像所表现的那样建立直接的连接,而是通过web服务器作为中介。这时在web服务器更像一个大信箱,里面装着很多信,有大家都可以看的公共信,也有私人信件(既悄悄话),感觉上就像真的相互是在直接通信一样。
对于ASP 的基本原理就不再叙述了。 构筑聊天室的精髓思想就是其内部对象 Application和Session的应用。Application 对象对应了一个全局全域变量的概念,随 服务器的启动关闭而创建删除。任何一个客户任何时候改变了它,都会引起改变,所以在聊天[室程序中用Application 对象来保存公共信息。Session 对象对应了一个客户的局部局域的概念,随客户开始进入站点页面时创建,各个客户拥有一个唯一的Session ID( 此ID保存在客户机Cookie中因此要求浏览器允许接受Cookie ), Session变量的改变对各客户是独立的,而且它可以保存同一站战点同一客户不同网页上的数据,所以在聊天室程序中用Session对象来保存聊天成员专用信息,如聊天代号、悄悄话等。
用ASP构筑聊天室充分体现了ASP和CGI程序的差别。CGI程序中,为每一个客户连接创建一个进程,其对资源的耗费是很大的。而ASP中Application 对象保存自己数据,共用一个进程空间,因此ASP的效率是很高的。
二、基础框架的构筑
一共需要两个页面,一个用作登录界面,一个作主聊天页面。登录页面login.asp很简单,就是一个from 表单,提交后把聊天代号等信息送给Session变量Session("name'),然后重导航(Response. Redirect mainchat.asp)到主页面mainchat.asp。主聊天页面由两个frame 组成:
frame1中放words.asp页面,用于显示聊天内容。frame2中放chat.asp 页面,用于发送聊天信息。
2、设置Application和Session 对象
使用Application("show" )存放公共信息,用Session("name")存放聊天室代号,这是很自然的。悄悄话用什么存放呢?这里用了一个很巧妙的方法:用Application(Session("name")存放悄悄话信息!每一个聊天代号都对应一个Application变量 ,在显示页面中用〈% = Application(Session("name")%>将显示属于本代号的悄悄话.
3、显示页面words.asp的关键语句:
// 每10秒钟刷新一次页面
...
// 显示悄悄话,如果有的话
...
//显示公共对话信息
...
4、chat.asp 主要实现消息发送,其中包括一个form表单,以填入要说的话及悄悄话接受者(为空表示公共信息),提交给chat.asp 自身,将表单数据送到各自的变量中去:要发送的消息到Application("show"),悄悄话接收者送到Applicatio(Secret)中。Chat.asp 的关键语句:
...
Talk=Trim(Request.From("txbox")// 为消息文本输入框, //此语句提取要送的消息内容。
Secret=Trim(Request.Form("secret")//secre为悄悄话接收者文本输入框 //此语句提取悄悄话接收者。
If Secret=""then
If Talk< >""then //发送公共信息到Application("show")
Application.lock
Application("show")=Session("name")&":"&Talk&"
"&Application("show")
Application.unlock
End if
Else
If Talk< >""then //送出悄悄话信息。
Application.lock
Application(Secret")=Session("name")&"给你的悄悄话:"& Talk // 此处 Secret为悄悄话接收者的代号,对照Application.unlock //words.asp中悄悄话显示语句,你会发现只有接收者才会显示这条悄悄话的,很巧妙吧。
End if
End if
...
这样,聊天室的基本框架建好了,你可以找几个朋友进去欲言了。但是还十分简陋,接下来将给聊天室增添一些重要功能如,在线人数统计、聊天代号列表、聊天动作设计、刷新时间控制等。
三、聊天室功能扩允
1、在线人数统计
我们设置一个全局的Application("peopenumw")变量存放在线人数,并用一个Session("access")变量表示客户状态即是否已进入聊天室。每次登录进入聊天室时,根据ac-cess的状态对peoplenum进行增一或减一的操作,这样一来可以避免客户重复登录以及重复增减计数(比如客户多次点击BACK按钮或FORWARD按钮)。具体实现为:
进入聊天室时判断access=0时(未进入聊天室),则在 login.asp页面提交后可以进入主聊天室,并将peoplenum加一,access标志置一;当access=1时(已经进入聊天室未正确退出),在进入login..asp页面时将弹出警示框“你未退出聊天室,请勿重复登录。”并重导航至聊天室内,以让客户退出。此时peoplenum不增加。
退出聊卫室时的情况相似,当access=1时,peoplenum减一;当access=0时,peoplenum不变。
可能朋友会提出一个问题,如果用户非正常退出,比如直接切换地址栏或关闭浏览器,能否正确统计出这种人数减员呢?可以的,每个Session都有一个On-SessionEnd事件,当Session结束时触发运行。因此可以在此事件处理程序中加入:
If Session("access")=1 then
Application.lock
Application("peoplenum")=Application("peoplenum")-1
Application.unlock
End if
这样,当一个客户非正常退出一段时间(Session之Timeout属性决定)以后,会自动减去这个人数的。
2、聊天室代号控制
聊天室代号作为聊天成员的标志,要求能列出线代号表,且不允许同名。我解决这个问题的办法是用了VBSCRIPT的一个内置对象Dictionary,它就是一个带键值的数组,可以通过方法add、remove进行成员增减,还可以用函数EXISTS判断某个键值是否存在,这正好用于防止代号同名。
首先我们要创建一个Dictionary对象,可以在脚本中用Set Nickname=CreateObject("Scripting.Dictionary")创建,这里我们也可以在Global.asp中通过(object)标记创建,就可以在任何地方引用它了。
(OBJECT RUNAT="SERVER"SCOPE=APPLICATION ID=ohatname PROID="Scripting.Dictionary")(/OBJECT)
注:Global.asp是放置在网站根目寻下的一个ASP专用文件,每当web服务器启动或关闭时,都会执行Global.asp文件,故常用作初始化或清理工作。
每次登录时,首先把代号传给Session("name"),然后
Nickname=Trim(Requeat.form("txtbox"))
...
chatname.add Nickname,Nickname
这样,在chatname中就保存了所有在线客户的代号。
而在每次退出时,要删除聊天代号:chat-name.remove Session("name")
如何在聊天室中列出在线客户代号呢?可以把悄悄话文本输入框改为一个可下拉的列表框,点击它时下拉显示所有代号列表,很简洁方便。
(select name="secrt')
(option Selected)//缺省选择为空,即不送悄悄话。
(% For=1 to chatname.count-1 %)
(option) (%=chatname.Session("name")%)// 列出所有代号名。
(%Next%)
(/select)
3、聊天室动作设计
如果你常去BBS聊天室的话,一定觉得那些动作很有趣。想在主页聊天室中加入动作吗?太容易了,只要你想要。在笔者的聊天室中采用了类BBS的动作模式,(其实模式可以任意,由自己决定了。)比如我输入“//kick menu“就会显示“XXX把menu踢得鼻青眼肿”,有趣吗。实是很简单的,判断输入字符首两个字符是否为“//”,然后根据后面的单词选择显示的内容。
If Instr(TALK,"//")=1 then
Select case Rtrim(Mid(Talk,3,5))//取“//”后的5个字符
Case "kik"
Application.lock
Application("show")=Session("name")&“把Right(Talk,len (Talk)-7) &“踢得鼻青眼肿。”& Application("show")
Application.unlock
Case...
End Select
End if
这里使用了VBSCRIPT的几个字符串函数,以提取了Talk中的动作信息。聊天室的动作可以任意扩充,在笔者的聊天室中就有许多《大话西游》的台词呢。
4、其他功能扩充
*设置刷新时间
在words.asp中用(META http-equiv=“refresh” content=“10”)设置了固定的刷新时间10秒,但在实际中需要用户根据情况自己设定刷新时间,比如在速度较快时希望刷新时间短,而在速度慢时或想查看过去信息时希望刷新时间长些。我们可以在chat.asp加入一个文本输入框以输入客户想要在刷新时间,将此时间传给Session(“freshtime”),并把word.asp的那条语句改为:(% Response. Write “(META http-equiv=““refresh””content=“““&Session(“freshtime”)&”””)”%)即可。
*客户各自独立地显示帮助列表和控制命令
大家可能注意到了,上面所述的动作要为网友所知,必须要有一个帮助列表,而客户可以随时显示在自己的浏览器上而不会影响别人的版面。我家定义一个Session("show")变量存放各浏览器独立的信息(包括帮助信息和一些控制命令信息)。
在发送帮助列表和控制命令(如清屏、改名等)时,仍采用类BBS的方式,输入\h显示帮助,输入\n newname则改名。跟聊天室动作处理类似,我们首先判断首字符是否为“\”,然后用一系列Select Casa语句列出各类信息或作出种控制操作。
好了,一个功能较为强大的聊天室就构筑好了,在实际中还有许多自主性和可扩充的空间,各位朋友可以根据自己的喜好自由发 挥。