再谈在asp聊天室里实现房间功能与用户的显示
在我写下了《在asp聊天室里实现悄悄话功能》一文后,很多的朋友来信问我
关于其他高级功能实现的问题。确实,例如房间、用户管理等高级功能是一个完善的
聊天室所必有的功能。在这里面又以房间功能是比较难于实现的。因此我想和大家谈谈
这个问题。
我依然倾向于用数组来解决这两个问题,这并不是说不能用数据库来解决,但我们
要考虑性能的问题。而且用数组有几个好处,利于排序,利于控制总的长度。在服务器
内存中长驻(有利于性能的提高)。我先讲一讲房间的问题,这里给出大家在两个系统
房间中切换的方法。至于自建房间的方法,希望大家能触类旁通。还有关于用户在线显示的
问题,因为我们既要显示各个房间的用户和总的用户,所以会和房间产生一些互动,在讲的
时候请大家注意。为了大家使用的方便,我尽量把这些功能写成子程序或子函数,大家可以
直接的应用。
我们先看在gloable.asa中的定义,这很重要
<script language="vbscript" runat="server">
sub application_onstart()
application("groom_name")="逍遥游" 保存主聊天室的名字,所有人先到的聊天室
dim pchat_value(50)
application(application("groom_name")&"_value")=pchat_value p代表private g代表globle 用来保存逍遥游聊天室的内容
application(application("groom_name")&"_number")=0 用来保存逍遥游聊天室的谈话的数目
application("养生主"&"_value")=pchat_value
application("养生主"&"_number")=0
dim pchater_value(150)
application(application("groom_name")&"er_value")=pchater_value 用来保存逍遥游聊天室的聊天者的名字
application(application("groom_name")&"er_number")=0 用来表示逍遥游聊天室的上线的人数
application("养生主"&"er_value")=pchater_value
application("养生主"&"er_number")=0
dim proom_value(50)
proom_value(0)="逍遥游"&"("&"系统"&")"&"["&application(application("groom_name")&"er_number")&"]"&"人"
proom_value(1)="养生主"&"("&"系统"&")"&"["&application("养生主"&"er_number")&"]"&"人"
application("groom_value")=proom_value 用来保存房间的名字
application("groom_number")=2
end sub
sub session_onstart()
session("sroom_name")=application("groom_name")每个新用户的默认房间
session("schater_name")="" s代表session 用来保存说话者的名字
strprovider="driver={microsoft access driver (*.mdb)}; dbq="&server.mappath("../chat")&"\"&"db\chater_message.mdb;"
set cres=server.createobject("adodb.connection")
set res=server.createobject("adodb.recordset")
cres.open strprovider
res.activeconnection=cres
set session("res")=res 一个recordset的实例
end sub
在gloable.asa中进行了如上的定义后,我们就可以在后面的页面中应用了。我们假设
先有一个用户的登陆确认(从数据库中确认用户的信息)大致的代码如下:
<!–
#include virtual="/chat/inc/convert.inc"
–> <%将欢迎的内容记入application数组并调整顺序%>
<!–
#include virtual="/chat/inc/roomrefresh.inc"
–>
<!–
#include virtual="/chat/inc/logname.inc"
–> <%将姓名记入application数组%>
<%
if request.servervariables("request_method")="post" and session("schater_name")="" then
name=request.form("txtname")
pass=request.form("txtpass")
set res=session("res")
sql="select * from chater_message where name="&name&" and pass="&pass&";"
res.open sql,,3,3
if res.bof then
response.write "login failed"&"<br>"
response.write "<a href="&chr(34)&"loginpage.htm"&chr(34)&">"&"请重新登陆"&"</a>"
res.close
else
session("schater_name")=name
welcome_message="common"&","&"系统"&","&"所有人"&","&"<font color="&chr(34)&"#ff98ff"&chr(34)&">"&"各位看官,"&session("schater_name")&"来也"&"</font>"&"<br>"
这句话请大家一定要注意,如果你读了我的上一篇文章你应该知道是什么意思。
application.lock
call convert(welcome_message)
call logname(session("schater_name"),session("sroom_name"))
call roomrefresh()
application.unlock
res.close
response.redirect "chatpage.htm"
end if
end if
%>
下面是三个关键的子程序,在后面也有大量的应用。
convert.inc
<%
sub convert(message)
dim tmpchat_value()
pchat_value=application(session("sroom_name")&"_value")
pchat_number=application(session("sroom_name")&"_number")
由于使用了session("sroom_name")来保存当前的房间名,因此可以被每个房间的
提交子过程调用。
if pchat_number>=50 then
pchat_number=0
end if
redim tmpchat_value(pchat_number)
for i=0 to pchat_number
tmpchat_value(i)=pchat_value(i)
next
pchat_value(0)=message
for i=0 to pchat_number
pchat_value(i+1)=tmpchat_value(i)
next
pchat_number=pchat_number+1
application(session("sroom_name")&"_value")=pchat_value
application(session("sroom_name")&"_number")=pchat_number
end sub
%>
logname.inc
<%
sub logname(chater_name,room_name)
pchater_value=application(session("sroom_name")&"er_value")
pchater_number=application(session("sroom_name")&"er_number")
if pchater_number>=150 then
pchater_number=0
end if
pchater_value(pchater_number)=chater_name&"["&room_name&"]"
pchater_number=pchater_number+1
application(session("sroom_name")&"er_value")=pchater_value
application(session("sroom_name")&"er_number")=pchater_number
end sub
%>
roomferesh.inc
<%
sub roomrefresh()
proom_number=application("groom_number")
proom_value=application("groom_value")
for i=0 to proom_number-1
room_name=left(proom_value(i),instr(proom_value(i),"(")-1)
proom_value(i)=left(proom_value(i),instr(proom_value(i),"[")-1)&"["&application(room_name&"er_number")&"]"&"人"
next
application("groom_number")=proom_number
application("groom_value")=proom_value
end sub
%>
这个子程序大家可能不太明白,他是用于显示各个房间信息的。
好了,下面是关键的显示页面chatpage.html,它分为三帧,左右为80%,20%,然后
再将右面的分为上下80%,20%,左上的部分就是主的显示页面
showpage.asp
<!–
#include virtual="/chat/inc/convert.inc"
–> <%将内容记入application数组并调整顺序%>
<!–
#include virtual="/chat/inc/changeroom.inc"
–> <%处理换房的过程%>
<!–
#include virtual="/chat/inc/logname.inc"
–>
<!–
#include virtual="/chat/inc/ulogname.inc"
–>
<%
if request.servervariables("request_method")="post" then
if request.form("cmdchangeroom")="换房" then
application.lock
call changeroom()
application.unlock
else
chat=request.form("txtchat")
who=session("schater_name")
towho=request.form("selshow")
common_or_private="common"
chat=who&towho&"说:"&chat
if request.form("chkprivate")="private" then
common_or_private="private"
chat=chat&"[私聊]"
end if
application.lock
call convert(common_or_private&","&who&","&towho&","&chat&"<br>")
application.unlock
end if
end if
%>
<html>
<head>
<title> showpage </title>
</head>
<body>
<center>
<%
response.write session("sroom_name")
%>
</center>
<%
for i=0 to application(session("sroom_name")&"_number")-1
position_one=instr(application(session("sroom_name")&"_value")(i),",")
position_two=instr(position_one+1,application(session("sroom_name")&"_value")(i),",")
position_three=instr(position_two+1,application(session("sroom_name")&"_value")(i),",")
if mid(application(session("sroom_name")&"_value")(i),1,position_one-1)="common" or session("schater_name")=mid(application(session("sroom_name")&"_value")(i),position_one+1,position_two-position_one-1) or session("schater_name")=mid(application(session("sroom_name")&"_value")(i),position_two+1,position_three-position_two-1) then
response.write mid(application(session("sroom_name")&"_value")(i),position_three+1)
end if
next
大家注意了,这里是关键的关键,房间的显示与悄悄话的处理都在这里了
代码是太长了,但若使用好的数据结构应该能大大简化代码,我会用sever端的
javascript来试一试,希望可以
%>
<%
end if
%>
</body>
</html>
好长哦,^o^,没办法,高级的功能要付出大的代价,我这里是想告诉大家一种思想
以前你肯定定义过application("var1")这样的变量,但象application(session("sroom_name")&"_value")
这样的呢???我会在近期将它做成一个activex控件,那时大家就方便了。
想要的话给我写个mail就行了。。
