在主页上拥有一个聊天室,会给你的主页空间增添许多情趣,特别是在 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的关键语句:
<html>
<meta htpp-equiv=”refresh” content=”10″>// 每10秒钟刷新一次页面
…
<%=application(session(“name”))%>// 显示悄悄话,如果有的话
…
<%=application(“show”)%>//显示公共对话信息
…
</html>
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&”<br>”&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语句列出各类信息或作出种控制操作。
好了,一个功能较为强大的聊天室就构筑好了,在实际中还有许多自主性和可扩充的空间,各位朋友可以根据自己的喜好自由发挥。