聊天室实现私聊
作者:
聊天室实现私聊
几个要好的网友在聊天室里闲聊的时侯,总会遇上有些话题是不想同一聊天室内别的聊友看见的,那么聊天室支持悄悄话功能将是什分有必要的了,实现悄悄话的方法很多,现在小虎介绍一下利用session对象来实现它,用session对象来实现悄悄话,是有优缺点的,因为session对象的应用,其实就是客户端cookies的使用。如果客户端cookies不支持或关闭了,那么程序运行起来就有问题了。那么使用session对象就没好处了吗??非也,至少在编程上大大减少了工作量嘛,试想一下如果需要保存该用户的聊天名字,那么使用session对象就能直接保存他的名字了,如果没有session对象。解决的方法看来就只有在处理发言的FORM里设几个隐含的textbox对象来保存,这样处理起来会比教烦锁,但好处是通用性广,就算浏览器不支持cookies仍然可用。
说到这里,大伙不妨试试网上众多的ASP聊天室,试把浏览器的安全选项(总是接受cookies关了)看看那个聊天室仍然正常地能使用。那个就问题百出来。。呵呵~~不要找小虎的聊天室来试哦....我的聊天室也需要cookies来支持的。不用session对象编程真是烦锁很多。而且大部分浏览器的安全配置的默认值是总是接受cookies。所以也不用太但心,只有少部分的用户是比教特别的。
现在从聊天室的发言开始,到处理发言,显示发言,一步一步地让大家了解一下是如何处理的,最后就加上悄悄话功能
首先,我们的聊天室主要提供如下元素:发言人(你的名字),动作(叫嚷,抱抱...等),对象(这句话是向谁说的呢?),发言内容等四大元素。
其中发言人(你的聊天名字)的名字是保存在发言FORM的user隐藏文本框中,这样每当发言的时侯,在处理发言的says.asp程序里,就可以用request.form("user")来取得聊天名字。而动作则是由下拉框action来提供的,你可以自定义很多的动作类型,以满足不同聊友的需要。而发言对象,也是由下拉框whoto来选定,这些名单是列出当前聊天室内所有用户的名称。如何判断有新用户进聊天室以及退出处理,这里先不说了。因为构造一个完整的聊天室要做的工作还是挺多的。最后由一个says文本框提供发言内容。
有了这几个主要的聊天元素。我们就可以进行发言处理了。
请看看下面的程序片段
'取得说话内容,并过滤其中的脚本语句
usersays=request.form("says")
if instr(usersays,"<script")>0 then
usersays=""
end if
'判断是否有谈话内容,没有的话就不作处理
if len(usersays)<>0 then
session("whoto")=request.form("whoto")
session("action")=request.form("action")
if instr(usersays,chr(39))>0 then
usersays=replace(usersays,chr(39),"\"&chr(39))
end if
if instr(usersays,chr(34))>0 then
usersays=replace(usersays,chr(34),"\"&chr(34))
end if
application.lock
'定义一个交谈缓冲区,后面将给大家仔细分析一下
dim chats(20)
for n=1 to 20
chats(n)=application("chats")(n)
next
username=request.Form("user")
usertime=Time
usertime="("&right(usertime,8)&")"
user_whoto=request.Form("whoto")
user_action=request.Form("action")
if application("counter")>19 then
application("counter")=0
end if
'不是耳语就加一
if request.form("action")<>"耳语" then
application("counter")=application("zj_1counter")+1
counter=application("zj_1counter")
'用户的动作处理
select case request.FORM("action")
case "说话"
if request.FORM("whoto")="ALL" then
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> :<font color=#0000aa> "&usersays&"</font><BR><BR>"
else
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>与<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
end if
case "叫嚷"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>冲<font color=#00bb00> "&request.FORM("whoto")&" </font>大叫</I>:<B><font color=#0000aa> "&usersays&"</font></B><BR><BR>"
case "亲亲"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>亲了亲<font color=#00bb00> "&request.FORM("whoto")&" </font>的脸颊</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "拥抱"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>轻轻的抱着<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "暴怒"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>朝<font color=#00bb00> "&request.FORM("whoto")&" </font>横眉竖目道</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "轻推"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>轻轻地推了推<font color=#00bb00> "&request.FORM("whoto")&" </font>的胳膊</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "傻笑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>傻兮兮的朝<font color=#00bb00> "&request.FORM("whoto")&" </font>笑笑</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "拳打"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对准<font color=#00bb00> "&request.FORM("whoto")&" </font>就是一拳</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "脚踢"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>凌空一腿踢在<font color=#00bb00> "&request.FORM("whoto")&" </font>脑袋上</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "告戒"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>拉着<font color=#00bb00> "&request.FORM("whoto")&" </font>手语气心长地说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "耳光"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>狠狠地掴了<font color=#00bb00> "&request.FORM("whoto")&" </font>几个耳光</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "鞠躬"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>毕恭毕敬地向<font color=#00bb00> "&request.FORM("whoto")&" </font>弯腰鞠躬</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "歉意"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>感到十二分的歉意,低声对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "惊讶"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>惊讶的对<font color=#00bb00> "&request.FORM("whoto")&" </font>吐了吐舌头</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "哈欠"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对<font color=#00bb00> "&request.FORM("whoto")&" </font>张大嘴巴,打了个哈欠</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "微笑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对<font color=#00bb00> "&request.FORM("whoto")&" </font>微微一笑</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "握手"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>紧紧的握住<font color=#00bb00> "&request.FORM("whoto")&" </font>的手</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "耸肩"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>耸耸双肩</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "安慰"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>拍拍<font color=#00bb00> "&request.FORM("whoto")&" </font>的肩膀,双眼关切的说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "生气"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>气鼓鼓的嘟嘴对<font color=#00bb00> "&request.FORM("whoto")&" </font>道</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "大哭"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>忍不住对着<font color=#00bb00> "&request.FORM("whoto")&" </font>放声大哭</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "抽泣"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>双手捂着脸,对着<font color=#00bb00> "&request.FORM("whoto")&" </font>呜呜咽咽的</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "承诺"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>把胸脯拍得噼啪响</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "不舍"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>依依不舍地拉着<font color=#00bb00> "&request.FORM("whoto")&" </font>的衣角</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "深情"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>用深情的眼神,痴痴地看着<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "迷惑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>抓抓头皮看着<font color=#00bb00> "&request.FORM("whoto")&" </font>露出迷惑的神情</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "不解"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>用不可思意的眼神看着<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "幸灾"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>幸灾乐祸地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "大笑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>捧腹大笑</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "皱眉"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>皱着眉头对<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "委屈"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>很委屈地看着<font color=#00bb00> "&request.FORM("whoto")&" </font>眼泪哗啦啦地往下流</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "高兴"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>兴高采烈地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "沮丧"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>满脸沮丧地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "失望"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>垂头丧气地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "神经"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>神经兮兮地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "神秘"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>非常神秘地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "撒娇"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>拉着<font color=#00bb00> "&request.FORM("whoto")&" </font>手撒娇</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "鬼脸"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>做了个鬼脸</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "无奈"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>很无奈地</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
end select
'是耳语
else
'耳语处理
application("chat")="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>悄悄地对<font color=#00bb00> "&request.FORM("whoto")&" </font>耳语</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
'对谁说
application("chatto")=request.FORM("whoto")
'说话的人
application("owner")=username
session("chat")="true"
end if
'谈话全局化
application("chats")=chats
application.unlock
end if
上面的程序是把用户的发言和动作以及说话对象生成html语句并保存起来。用以后面的在聊天室中显示出来,其中请大家注意一下耳语是保存在application("chat")这个全局应用程序对象中的。好了,下节先为大家详细分析一下说话的内容是如何处理。
聊天室程序是一个application和session对象结合性很强的asp程序。首先,它比较具有实时性,聊天速度太慢,那么没有人会喜欢的,而且在多人同时发言的时侯,如果程序处理不好,那么难免会发生张官李戴的现象,比如说明明张三说的话在先。李四说的话在后,但显示出来的结果却是倒转了。还有就是每个客户端显示的谈话内容不同步。(这里强调一点,聊天室的谈话内容自动更新方式主要是两种,一种是服务器自动更新,也就是它的聊天显示内容区是一个正在打开中的html流,每当服务器接收到用户的谈话内容就会发送到用户的浏览器中。另一种是用户端定时向服务器端发出更新请求。后者的实时性没前者强。但制作起来简单,要完成服务器端自动更新,光靠asp是无法完成的。因为ASP没有内置的延时功能。现在所举例的聊天室主要是以后者来说明的,但方法同样可以前者里使用)
要解决多个用户同时发言以及显示的顺序问题,那么就必须为谈话内容建立一个缓冲区,就好象操作系统的键盘缓冲区的功能一样,即使系统正在忙于处理别的任务,但还是可以准确地接受用户输入。
上面的程序例子:
dim chats(20)
for n=1 to 20
chats(n)=application("chats")(n)
next
就是建立了一个20个元素的chats数组,那么只需要再建立一个全局公用的计数器(用application对象来保存),用以指示当前最新的发言内容是在那一个元素当中。而每个用户又定义一个session对象的计数器。用以记录当前聊天者本机显示的信息是显示到那一条谈话记录上。两者之差的谈话内容都必须在下一次更新说话内容的时侯显示出来。
chats数组作为一个谈话缓冲区,是需要循环使用的。比如第一句发言的保存在chats(1)中,第二十句则保存在chats(20)中,而第二十一句则重新使用chats(1)来保存,而把第一句的内容覆盖掉。而chats数组只是用于处理公共的谈话内容。也就是不是“悄悄话”如果把悄悄话也作为一条新的信息保存在这里,那么就会影响的计数器了。因为对于非悄悄话的聊天对象来说。这句话是无意义的。为了减少条件判断,就把悄悄话另外用application("chat")这个应用对象变量来保存。在悄悄话的处理用,小虎并没有使用缓冲区,因此当同一聊天室内多个网友同时使用悄悄话功能时,就可能出现有的悄悄话在没被显示出来之前,被漏掉的缺点,大家不妨可以发挥自己的智慧去改进一下哦:)
当处理完chats的对话内容后。必须把它重新存储到application("chats")(n)这个全局的谈话缓冲区中,那样才能让所有用户共享对话内容。
下面是对耳语的谈话处理
'耳语处理
application("chat")="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>悄悄地对<font color=#00bb00> "&request.FORM("whoto")&" </font>耳语</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
'对谁说
application("chatto")=request.FORM("whoto")
'说话的人
application("owner")=username
session("chat")="true"
end if
session("chat")是一个用来记录用户是否有悄悄话的标记,当更新对话内容的时候,就通过判断这个标记来判断是否有悄悄话产生。同时。通过applicaton("chat")记录对话内容,applicaton("chatto")悄悄话的对象,application("owner")保存发言者本人(别忘了悄悄话是自己和接受悄悄话的对方可以看见的哦:(,还有,当对ALL(所有人)发悄悄话时,大家都应能看见这句瞧瞧话。
当发言内容都分别进入了application("chats")(n)和applicaton("chat")这两个谈话缓冲区后。下一步要做的就是显示出对话内容了。这里先向大家提一下如何实现聊天事的定时刷新(客户端主动)
在我们的html文件的头有一个这样的标记
<meta http-equiv="refresh" content="2.5">
这里示了html文档的更新类行,上面这个标记就是把本文档按2.5秒的速度不断自动刷新,那么利用这一点,就可以实现自动更新对话内容了。我们使用的显示对话的asp文件名为top.asp。下一节大家一起来看看它的结构。
上两节介绍了如何处理聊天室内的谈话内容以及悄悄话的特殊处理,至此。我们去看看谈话内容是如何在客户端显示出来的。请先看看我们的显示对话文件(top.asp)
*top.asp
<% @language="vbscript" %>
<%
Response.Expires=0
'response.buffer=true
%>
<meta http-equiv="refresh" content="2.5">
<body bgcolor="<%=application("zj_1color")%>" topmargin="0" leftmargin="0">
<I><center><font color="#FFFF00" size=4><%=application("zj_1title")%></font></center></I>
<%
if session("userzj_1")="" then
session("userzj_1")=""
session("zj_1level")=""
session("zj_1start")=""
session("zj_1total")=0
session("zj_1boot")=""
session("zj_1counter")=0
session("zj_1open")=""
'session.abandon
%>
<script LANGUAGE="javascript">
parent.location="timeout.htm"
</script>
<%
response.end
end if
'是否在捣乱?
for n=1 to 40
if session("userzj_1")=application("peoplezj_1"&n) then
exit for
end if
if n=40 then
session("zj_1boot")="true"
%>
<script LANGUAGE="javascript">
parent.location="boot.htm"
</script>
<%
end if
next
%>
<script LANGUAGE="javascript">
<%
if session("zj_1counter")<>application("zj_1counter") then
if session("zj_1counter")<application("zj_1counter") then
for I=session("zj_1counter")+1 to application("zj_1counter")
%>
parent.middle.document.writeln("<%=application("zj_1chats")(I)%>")
<%
next
else
for I=session("zj_1counter") to 20
if application("zj_1counter")<>1 then
%>
parent.middle.document.writeln("<%=application("zj_1chats")(I)%>")
<%
end if
next
for I=1 to application("zj_1counter")
%>
parent.middle.document.writeln("<%=application("zj_1chats")(I)%>")
<%
next
end if
if session("zj_1open")="true" then
session("zj_1counter")=application("zj_1counter")
end if
end if
'公告
if session("zj_1public")<>application("zj_1public") then
%>
parent.middle.document.writeln("<%=application("zj_1public")%>")
<%
session("zj_1public")=application("zj_1public")
end if
'有耳语吗?
if session("zj_1chat")<>application("zj_1chat") then
if application("zj_1owner")=session("userzj_1") or application("zj_1chatto")=session("userzj_1") or application("zj_1chatto")="ALL" then
%>
parent.middle.document.writeln("<%=application("zj_1chat")%>")
<%
end if
session("zj_1chat")=application("zj_1chat")
end if
application("peoplezj_1_appear"&n)
count=0
for n=1 to 40
if application("peoplezj_1"&n)<>"" then
count=count+1
end if
next
if session("zj_1total")<>count then
session("zj_1total")=count
session("zj_1refresh")="true"
%>
</script>
<%
end if
response.flush
%>
聊天室具备了管理(把不受欢迎的人踢出聊天室,公告等的功能,因此与发言处理和悄悄话功能无关的部分小虎不作解说了。
前面我们用了一个application("zj_1counter")的公有对象来保存最新发言所在的缓冲元素。用session("zj_1counter")来保存当前用户本身已显示的对话元素。在每次调用top.asp这个文件,只要对比出session("zj_1counter")与application("zj_1counter")的取值不同,就可以得知需要显示新的交谈发言。而每次完成显示,又必须把两个计数值统一个。不然就会发生重复显示对话内容的错误了。
又于缓冲区是循环使用的,比如说当前用户现示的对话内容是存储在application("chats")(18)中,而新的发言已经重新回到application("chats")(2)了,因此本次需要显示4条发言,上面的详细处理解说小虎不做了。大家仔细看看。然后想一想,是很容易明白的。
又于耳语和公共对话application("chat")(n)是分开处理的,因此公有对话处理完毕后,就到了耳语的处理。耳语标志是session("chat")(它用来存储上一次的耳语内容,当对比出application("chat")本次的耳语内容于上次的不符,就可以得知需要显示耳语了,当耳语显示后,别忘了把session("chat")与application("chat")同步哦,不然耳语就在你耳边“响”个不停,吵死了。。
这里向大家介绍了处理耳语的一种方法,做聊天室的方法很多。好与坏会影响到聊天室的性能(速度。。容错性等等)。制作一个好的聊天室是很有技巧的。在这一点上。小虎感到自己的聊天室还是做的不算好。有待改进。
本例子的聊天室地址:http://active.t500.net。欢迎大家作客“素素心语
*注程序中的session("zj_1chat")与解说中的session("chat")实际是同一个变量,application("zj_1chats")(n)等也是如此类推。。。麻烦大家留意一下。小虎不去修改程序中的不同之处了
我曾经做过一个比较复杂的聊天室,几乎拥有BBS聊天室的所有功能,但因为是用application做的,所以比较浪费资源。我觉得用数据库做更可靠,更简单。
可以设定这样的一个数据库chat,结构如下:
字段名 类型 长度 备注
1.. OBJECT CHAR 10 操作对象,ALL或某人
2.. MSG CHAR 250 消息内容
3.. TIME DATETIME 发送时间
4.. SENDER CHAR 10 发送人
5.. ROOM CHAR 10 房间名,发送人所处房间
在通常情况下OBJECT为ALL,当需要说悄悄话时可以指定某人。
显示内容时,只要一句“Select * from chat where object='all' or object='" & session("userid") & "'"就可以了。Session(”USER ID“)是当前用户的身份认证。
如此,每个用户看到的聊天内容都是自己“应该”看到的。如果配合另外一些数据表,如ROOM,USER,则还可以完成诸如隐身、踢人、开房间、关房间、隐藏房间等功能,如果再加上一个表情配置文件EMOTE。TXT就可以做表情动作了。当然,这么做就需要在发送信息是有一个解释程序,用以判断用户输入的是何种命令,并相应修改数据表。
roking:roking@21cn.com
先说一下整体构思:采用application对象保存所有聊天公用信息,如访问者ID、房间状态、公聊信息等,同时为每个人用Senssion对象保存和个人相关的信息,如:表情、颜色、谈话目标ID等。
用户的显示区从application对象中取出公聊信息并加上针对自己的私聊一同显示。。。。
nikl:nikl@163.net
“悄悄话”只须用Application和Session两个内建对象就可以轻松实现具体如下,希望能帮到忙!
在用户登陆时分别为他建立独立的Application & Session对象。例如有三个用户nikl hero viki在他们登陆时用ASP的Request分别取得三个用户名并存入一个变量(如name)然后作Session和Application的初始化:
Session("Uname")=name
Application(who)=""
耳语信息存在变量 say 中,交谈对象存在who。例如:
nikl to viki : 你吃饭了吗?
服务器端执行代码,经过条件判断后执行耳语传入操作,谈话内容“你吃饭了吗?”及交谈对象“VIKI”并分别赋于变量 say 和 who; 信息(你吃饭了吗?)传 入Application("viki")中了(代码:Application(who)=say),目的用户端只要刷新Application(Session"Uname")变量就可以看到信息了,程序结束。
请留意:
在VIKI端的<%=Application(Session("name"))%>实际是<%=Application(VIKI))%> (在VIKI登陆时Session("Uname")已定义为“VIKI”并存在浏览器)因而,当信息内容框刷新时Session("Uname")将被“VIKI”替换,VIKI就可以看到NIKL发送来的耳语信息,而hero端<%=Application(Session("Uname"))%>实际是<%=Application(hero)%>这个变量是空的因而hero就看不到NIKL发送给VIKI的信息。就这样巧妙地完成了一次耳语的传送。
说到这里,大伙不妨试试网上众多的ASP聊天室,试把浏览器的安全选项(总是接受cookies关了)看看那个聊天室仍然正常地能使用。那个就问题百出来。。呵呵~~不要找小虎的聊天室来试哦....我的聊天室也需要cookies来支持的。不用session对象编程真是烦锁很多。而且大部分浏览器的安全配置的默认值是总是接受cookies。所以也不用太但心,只有少部分的用户是比教特别的。
现在从聊天室的发言开始,到处理发言,显示发言,一步一步地让大家了解一下是如何处理的,最后就加上悄悄话功能
首先,我们的聊天室主要提供如下元素:发言人(你的名字),动作(叫嚷,抱抱...等),对象(这句话是向谁说的呢?),发言内容等四大元素。
其中发言人(你的聊天名字)的名字是保存在发言FORM的user隐藏文本框中,这样每当发言的时侯,在处理发言的says.asp程序里,就可以用request.form("user")来取得聊天名字。而动作则是由下拉框action来提供的,你可以自定义很多的动作类型,以满足不同聊友的需要。而发言对象,也是由下拉框whoto来选定,这些名单是列出当前聊天室内所有用户的名称。如何判断有新用户进聊天室以及退出处理,这里先不说了。因为构造一个完整的聊天室要做的工作还是挺多的。最后由一个says文本框提供发言内容。
有了这几个主要的聊天元素。我们就可以进行发言处理了。
请看看下面的程序片段
'取得说话内容,并过滤其中的脚本语句
usersays=request.form("says")
if instr(usersays,"<script")>0 then
usersays=""
end if
'判断是否有谈话内容,没有的话就不作处理
if len(usersays)<>0 then
session("whoto")=request.form("whoto")
session("action")=request.form("action")
if instr(usersays,chr(39))>0 then
usersays=replace(usersays,chr(39),"\"&chr(39))
end if
if instr(usersays,chr(34))>0 then
usersays=replace(usersays,chr(34),"\"&chr(34))
end if
application.lock
'定义一个交谈缓冲区,后面将给大家仔细分析一下
dim chats(20)
for n=1 to 20
chats(n)=application("chats")(n)
next
username=request.Form("user")
usertime=Time
usertime="("&right(usertime,8)&")"
user_whoto=request.Form("whoto")
user_action=request.Form("action")
if application("counter")>19 then
application("counter")=0
end if
'不是耳语就加一
if request.form("action")<>"耳语" then
application("counter")=application("zj_1counter")+1
counter=application("zj_1counter")
'用户的动作处理
select case request.FORM("action")
case "说话"
if request.FORM("whoto")="ALL" then
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> :<font color=#0000aa> "&usersays&"</font><BR><BR>"
else
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>与<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
end if
case "叫嚷"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>冲<font color=#00bb00> "&request.FORM("whoto")&" </font>大叫</I>:<B><font color=#0000aa> "&usersays&"</font></B><BR><BR>"
case "亲亲"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>亲了亲<font color=#00bb00> "&request.FORM("whoto")&" </font>的脸颊</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "拥抱"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>轻轻的抱着<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "暴怒"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>朝<font color=#00bb00> "&request.FORM("whoto")&" </font>横眉竖目道</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "轻推"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>轻轻地推了推<font color=#00bb00> "&request.FORM("whoto")&" </font>的胳膊</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "傻笑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>傻兮兮的朝<font color=#00bb00> "&request.FORM("whoto")&" </font>笑笑</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "拳打"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对准<font color=#00bb00> "&request.FORM("whoto")&" </font>就是一拳</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "脚踢"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>凌空一腿踢在<font color=#00bb00> "&request.FORM("whoto")&" </font>脑袋上</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "告戒"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>拉着<font color=#00bb00> "&request.FORM("whoto")&" </font>手语气心长地说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "耳光"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>狠狠地掴了<font color=#00bb00> "&request.FORM("whoto")&" </font>几个耳光</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "鞠躬"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>毕恭毕敬地向<font color=#00bb00> "&request.FORM("whoto")&" </font>弯腰鞠躬</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "歉意"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>感到十二分的歉意,低声对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "惊讶"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>惊讶的对<font color=#00bb00> "&request.FORM("whoto")&" </font>吐了吐舌头</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "哈欠"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对<font color=#00bb00> "&request.FORM("whoto")&" </font>张大嘴巴,打了个哈欠</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "微笑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对<font color=#00bb00> "&request.FORM("whoto")&" </font>微微一笑</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "握手"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>紧紧的握住<font color=#00bb00> "&request.FORM("whoto")&" </font>的手</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "耸肩"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>耸耸双肩</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "安慰"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>拍拍<font color=#00bb00> "&request.FORM("whoto")&" </font>的肩膀,双眼关切的说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "生气"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>气鼓鼓的嘟嘴对<font color=#00bb00> "&request.FORM("whoto")&" </font>道</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "大哭"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>忍不住对着<font color=#00bb00> "&request.FORM("whoto")&" </font>放声大哭</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "抽泣"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>双手捂着脸,对着<font color=#00bb00> "&request.FORM("whoto")&" </font>呜呜咽咽的</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "承诺"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>把胸脯拍得噼啪响</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "不舍"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>依依不舍地拉着<font color=#00bb00> "&request.FORM("whoto")&" </font>的衣角</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "深情"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>用深情的眼神,痴痴地看着<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "迷惑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>抓抓头皮看着<font color=#00bb00> "&request.FORM("whoto")&" </font>露出迷惑的神情</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "不解"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>用不可思意的眼神看着<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "幸灾"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>幸灾乐祸地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "大笑"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>捧腹大笑</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "皱眉"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>皱着眉头对<font color=#00bb00> "&request.FORM("whoto")&" </font></I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "委屈"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>很委屈地看着<font color=#00bb00> "&request.FORM("whoto")&" </font>眼泪哗啦啦地往下流</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "高兴"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>兴高采烈地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "沮丧"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>满脸沮丧地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "失望"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>垂头丧气地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "神经"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>神经兮兮地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "神秘"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>非常神秘地对<font color=#00bb00> "&request.FORM("whoto")&" </font>说</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "撒娇"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>拉着<font color=#00bb00> "&request.FORM("whoto")&" </font>手撒娇</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "鬼脸"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>做了个鬼脸</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
case "无奈"
chats(counter)="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>对着<font color=#00bb00> "&request.FORM("whoto")&" </font>很无奈地</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
end select
'是耳语
else
'耳语处理
application("chat")="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>悄悄地对<font color=#00bb00> "&request.FORM("whoto")&" </font>耳语</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
'对谁说
application("chatto")=request.FORM("whoto")
'说话的人
application("owner")=username
session("chat")="true"
end if
'谈话全局化
application("chats")=chats
application.unlock
end if
上面的程序是把用户的发言和动作以及说话对象生成html语句并保存起来。用以后面的在聊天室中显示出来,其中请大家注意一下耳语是保存在application("chat")这个全局应用程序对象中的。好了,下节先为大家详细分析一下说话的内容是如何处理。
聊天室程序是一个application和session对象结合性很强的asp程序。首先,它比较具有实时性,聊天速度太慢,那么没有人会喜欢的,而且在多人同时发言的时侯,如果程序处理不好,那么难免会发生张官李戴的现象,比如说明明张三说的话在先。李四说的话在后,但显示出来的结果却是倒转了。还有就是每个客户端显示的谈话内容不同步。(这里强调一点,聊天室的谈话内容自动更新方式主要是两种,一种是服务器自动更新,也就是它的聊天显示内容区是一个正在打开中的html流,每当服务器接收到用户的谈话内容就会发送到用户的浏览器中。另一种是用户端定时向服务器端发出更新请求。后者的实时性没前者强。但制作起来简单,要完成服务器端自动更新,光靠asp是无法完成的。因为ASP没有内置的延时功能。现在所举例的聊天室主要是以后者来说明的,但方法同样可以前者里使用)
要解决多个用户同时发言以及显示的顺序问题,那么就必须为谈话内容建立一个缓冲区,就好象操作系统的键盘缓冲区的功能一样,即使系统正在忙于处理别的任务,但还是可以准确地接受用户输入。
上面的程序例子:
dim chats(20)
for n=1 to 20
chats(n)=application("chats")(n)
next
就是建立了一个20个元素的chats数组,那么只需要再建立一个全局公用的计数器(用application对象来保存),用以指示当前最新的发言内容是在那一个元素当中。而每个用户又定义一个session对象的计数器。用以记录当前聊天者本机显示的信息是显示到那一条谈话记录上。两者之差的谈话内容都必须在下一次更新说话内容的时侯显示出来。
chats数组作为一个谈话缓冲区,是需要循环使用的。比如第一句发言的保存在chats(1)中,第二十句则保存在chats(20)中,而第二十一句则重新使用chats(1)来保存,而把第一句的内容覆盖掉。而chats数组只是用于处理公共的谈话内容。也就是不是“悄悄话”如果把悄悄话也作为一条新的信息保存在这里,那么就会影响的计数器了。因为对于非悄悄话的聊天对象来说。这句话是无意义的。为了减少条件判断,就把悄悄话另外用application("chat")这个应用对象变量来保存。在悄悄话的处理用,小虎并没有使用缓冲区,因此当同一聊天室内多个网友同时使用悄悄话功能时,就可能出现有的悄悄话在没被显示出来之前,被漏掉的缺点,大家不妨可以发挥自己的智慧去改进一下哦:)
当处理完chats的对话内容后。必须把它重新存储到application("chats")(n)这个全局的谈话缓冲区中,那样才能让所有用户共享对话内容。
下面是对耳语的谈话处理
'耳语处理
application("chat")="<font color=blue>"&usertime&"</font> <font color=black>"&username&"</font> <I>悄悄地对<font color=#00bb00> "&request.FORM("whoto")&" </font>耳语</I>:<font color=#0000aa> "&usersays&"</font><BR><BR>"
'对谁说
application("chatto")=request.FORM("whoto")
'说话的人
application("owner")=username
session("chat")="true"
end if
session("chat")是一个用来记录用户是否有悄悄话的标记,当更新对话内容的时候,就通过判断这个标记来判断是否有悄悄话产生。同时。通过applicaton("chat")记录对话内容,applicaton("chatto")悄悄话的对象,application("owner")保存发言者本人(别忘了悄悄话是自己和接受悄悄话的对方可以看见的哦:(,还有,当对ALL(所有人)发悄悄话时,大家都应能看见这句瞧瞧话。
当发言内容都分别进入了application("chats")(n)和applicaton("chat")这两个谈话缓冲区后。下一步要做的就是显示出对话内容了。这里先向大家提一下如何实现聊天事的定时刷新(客户端主动)
在我们的html文件的头有一个这样的标记
<meta http-equiv="refresh" content="2.5">
这里示了html文档的更新类行,上面这个标记就是把本文档按2.5秒的速度不断自动刷新,那么利用这一点,就可以实现自动更新对话内容了。我们使用的显示对话的asp文件名为top.asp。下一节大家一起来看看它的结构。
上两节介绍了如何处理聊天室内的谈话内容以及悄悄话的特殊处理,至此。我们去看看谈话内容是如何在客户端显示出来的。请先看看我们的显示对话文件(top.asp)
*top.asp
<% @language="vbscript" %>
<%
Response.Expires=0
'response.buffer=true
%>
<meta http-equiv="refresh" content="2.5">
<body bgcolor="<%=application("zj_1color")%>" topmargin="0" leftmargin="0">
<I><center><font color="#FFFF00" size=4><%=application("zj_1title")%></font></center></I>
<%
if session("userzj_1")="" then
session("userzj_1")=""
session("zj_1level")=""
session("zj_1start")=""
session("zj_1total")=0
session("zj_1boot")=""
session("zj_1counter")=0
session("zj_1open")=""
'session.abandon
%>
<script LANGUAGE="javascript">
parent.location="timeout.htm"
</script>
<%
response.end
end if
'是否在捣乱?
for n=1 to 40
if session("userzj_1")=application("peoplezj_1"&n) then
exit for
end if
if n=40 then
session("zj_1boot")="true"
%>
<script LANGUAGE="javascript">
parent.location="boot.htm"
</script>
<%
end if
next
%>
<script LANGUAGE="javascript">
<%
if session("zj_1counter")<>application("zj_1counter") then
if session("zj_1counter")<application("zj_1counter") then
for I=session("zj_1counter")+1 to application("zj_1counter")
%>
parent.middle.document.writeln("<%=application("zj_1chats")(I)%>")
<%
next
else
for I=session("zj_1counter") to 20
if application("zj_1counter")<>1 then
%>
parent.middle.document.writeln("<%=application("zj_1chats")(I)%>")
<%
end if
next
for I=1 to application("zj_1counter")
%>
parent.middle.document.writeln("<%=application("zj_1chats")(I)%>")
<%
next
end if
if session("zj_1open")="true" then
session("zj_1counter")=application("zj_1counter")
end if
end if
'公告
if session("zj_1public")<>application("zj_1public") then
%>
parent.middle.document.writeln("<%=application("zj_1public")%>")
<%
session("zj_1public")=application("zj_1public")
end if
'有耳语吗?
if session("zj_1chat")<>application("zj_1chat") then
if application("zj_1owner")=session("userzj_1") or application("zj_1chatto")=session("userzj_1") or application("zj_1chatto")="ALL" then
%>
parent.middle.document.writeln("<%=application("zj_1chat")%>")
<%
end if
session("zj_1chat")=application("zj_1chat")
end if
application("peoplezj_1_appear"&n)
count=0
for n=1 to 40
if application("peoplezj_1"&n)<>"" then
count=count+1
end if
next
if session("zj_1total")<>count then
session("zj_1total")=count
session("zj_1refresh")="true"
%>
</script>
<%
end if
response.flush
%>
聊天室具备了管理(把不受欢迎的人踢出聊天室,公告等的功能,因此与发言处理和悄悄话功能无关的部分小虎不作解说了。
前面我们用了一个application("zj_1counter")的公有对象来保存最新发言所在的缓冲元素。用session("zj_1counter")来保存当前用户本身已显示的对话元素。在每次调用top.asp这个文件,只要对比出session("zj_1counter")与application("zj_1counter")的取值不同,就可以得知需要显示新的交谈发言。而每次完成显示,又必须把两个计数值统一个。不然就会发生重复显示对话内容的错误了。
又于缓冲区是循环使用的,比如说当前用户现示的对话内容是存储在application("chats")(18)中,而新的发言已经重新回到application("chats")(2)了,因此本次需要显示4条发言,上面的详细处理解说小虎不做了。大家仔细看看。然后想一想,是很容易明白的。
又于耳语和公共对话application("chat")(n)是分开处理的,因此公有对话处理完毕后,就到了耳语的处理。耳语标志是session("chat")(它用来存储上一次的耳语内容,当对比出application("chat")本次的耳语内容于上次的不符,就可以得知需要显示耳语了,当耳语显示后,别忘了把session("chat")与application("chat")同步哦,不然耳语就在你耳边“响”个不停,吵死了。。
这里向大家介绍了处理耳语的一种方法,做聊天室的方法很多。好与坏会影响到聊天室的性能(速度。。容错性等等)。制作一个好的聊天室是很有技巧的。在这一点上。小虎感到自己的聊天室还是做的不算好。有待改进。
本例子的聊天室地址:http://active.t500.net。欢迎大家作客“素素心语
*注程序中的session("zj_1chat")与解说中的session("chat")实际是同一个变量,application("zj_1chats")(n)等也是如此类推。。。麻烦大家留意一下。小虎不去修改程序中的不同之处了
我曾经做过一个比较复杂的聊天室,几乎拥有BBS聊天室的所有功能,但因为是用application做的,所以比较浪费资源。我觉得用数据库做更可靠,更简单。
可以设定这样的一个数据库chat,结构如下:
字段名 类型 长度 备注
1.. OBJECT CHAR 10 操作对象,ALL或某人
2.. MSG CHAR 250 消息内容
3.. TIME DATETIME 发送时间
4.. SENDER CHAR 10 发送人
5.. ROOM CHAR 10 房间名,发送人所处房间
在通常情况下OBJECT为ALL,当需要说悄悄话时可以指定某人。
显示内容时,只要一句“Select * from chat where object='all' or object='" & session("userid") & "'"就可以了。Session(”USER ID“)是当前用户的身份认证。
如此,每个用户看到的聊天内容都是自己“应该”看到的。如果配合另外一些数据表,如ROOM,USER,则还可以完成诸如隐身、踢人、开房间、关房间、隐藏房间等功能,如果再加上一个表情配置文件EMOTE。TXT就可以做表情动作了。当然,这么做就需要在发送信息是有一个解释程序,用以判断用户输入的是何种命令,并相应修改数据表。
roking:roking@21cn.com
先说一下整体构思:采用application对象保存所有聊天公用信息,如访问者ID、房间状态、公聊信息等,同时为每个人用Senssion对象保存和个人相关的信息,如:表情、颜色、谈话目标ID等。
用户的显示区从application对象中取出公聊信息并加上针对自己的私聊一同显示。。。。
nikl:nikl@163.net
“悄悄话”只须用Application和Session两个内建对象就可以轻松实现具体如下,希望能帮到忙!
在用户登陆时分别为他建立独立的Application & Session对象。例如有三个用户nikl hero viki在他们登陆时用ASP的Request分别取得三个用户名并存入一个变量(如name)然后作Session和Application的初始化:
Session("Uname")=name
Application(who)=""
耳语信息存在变量 say 中,交谈对象存在who。例如:
nikl to viki : 你吃饭了吗?
服务器端执行代码,经过条件判断后执行耳语传入操作,谈话内容“你吃饭了吗?”及交谈对象“VIKI”并分别赋于变量 say 和 who; 信息(你吃饭了吗?)传 入Application("viki")中了(代码:Application(who)=say),目的用户端只要刷新Application(Session"Uname")变量就可以看到信息了,程序结束。
请留意:
在VIKI端的<%=Application(Session("name"))%>实际是<%=Application(VIKI))%> (在VIKI登陆时Session("Uname")已定义为“VIKI”并存在浏览器)因而,当信息内容框刷新时Session("Uname")将被“VIKI”替换,VIKI就可以看到NIKL发送来的耳语信息,而hero端<%=Application(Session("Uname"))%>实际是<%=Application(hero)%>这个变量是空的因而hero就看不到NIKL发送给VIKI的信息。就这样巧妙地完成了一次耳语的传送。