当前位置: 首页 > 图文教程 > 网络编程 > ASP > 在asp聊天室里实现房间功能和用户显示

ASP
ASP正则表达式技巧
ASP Access实现网站计数器(访问量)
ASP新闻分页,将一篇过长的文章分页,生成静态页面
一些关于asp 购物车的想法
一个sql查询器,自动画表格填字段
ASP实现文件直接下载的代码
把网页中的(电话,qq等数字)生成图片的ASP程序
asp长文章用分页符来分页显示
Asp函数介紹(37个常用函数)
ASP中的面向对象类
分页实现方法的性能比较
asp ajax跨域提交数据
asp修改文件和文件夹的名字的代码
ASP 多关键词查询实例代码
asp被杀毒软件误删的解决方法
asp 多关键词搜索的简单实现方法
asp 根据IP地址自动判断转向分站的代码
asp dictionary对象的用法
ASP 千万级数据分页的存储过程
ASP隐藏真实文件的下载功能实现代码

ASP 中的 在asp聊天室里实现房间功能和用户显示


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 100 ::
收藏到网摘: n/a

在我写下了《在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就行了。。

请作者联系本站,及时附注您的姓名。联系邮箱:edu#ruanchen.com(把#改为@)。