明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

在asp聊天室里完成房間技巧與用戶顯示

[摘要]再談在asp聊天室里實(shí)現(xiàn)房間功能與用戶的顯示 在我寫下了《在asp聊天室里實(shí)現(xiàn)悄悄話功能》一文后,很多的朋友來信問我 關(guān)于其他高級(jí)功能實(shí)現(xiàn)的問題。確實(shí),例如房間、用戶管理等高級(jí)功能是一個(gè)完善的 聊天室所必有的功能。在這里面又以房間功能是比較難于實(shí)現(xiàn)的。因此我想和大家談?wù)?這個(gè)問題。 我依然傾向于用...

再談在asp聊天室里實(shí)現(xiàn)房間功能與用戶的顯示
在我寫下了《在asp聊天室里實(shí)現(xiàn)悄悄話功能》一文后,很多的朋友來信問我
關(guān)于其他高級(jí)功能實(shí)現(xiàn)的問題。確實(shí),例如房間、用戶管理等高級(jí)功能是一個(gè)完善的
聊天室所必有的功能。在這里面又以房間功能是比較難于實(shí)現(xiàn)的。因此我想和大家談?wù)?
這個(gè)問題。
我依然傾向于用數(shù)組來解決這兩個(gè)問題,這并不是說不能用數(shù)據(jù)庫(kù)來解決,但我們
要考慮性能的問題。而且用數(shù)組有幾個(gè)好處,利于排序,利于控制總的長(zhǎng)度。在服務(wù)器
內(nèi)存中長(zhǎng)駐(有利于性能的提高)。我先講一講房間的問題,這里給出大家在兩個(gè)系統(tǒng)
房間中切換的方法。至于自建房間的方法,希望大家能觸類旁通。還有關(guān)于用戶在線顯示的
問題,因?yàn)槲覀兗纫@示各個(gè)房間的用戶和總的用戶,所以會(huì)和房間產(chǎn)生一些互動(dòng),在講的
時(shí)候請(qǐng)大家注意。為了大家使用的方便,我盡量把這些功能寫成子程序或子函數(shù),大家可以
直接的應(yīng)用。
我們先看在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 用來保存逍遙游聊天室的內(nèi)容
application(application("gRoom_Name")&"_Number")=0 '用來保存逍遙游聊天室的談話的數(shù)目
application("養(yǎng)生主"&"_Value")=pChat_Value
application("養(yǎng)生主"&"_Number")=0

dim pChater_Value(150)
application(application("gRoom_Name")&"er_Value")=pChater_Value '用來保存逍遙游聊天室的聊天者的名字
application(application("gRoom_Name")&"er_Number")=0 '用來表示逍遙游聊天室的上線的人數(shù)
application("養(yǎng)生主"&"er_Value")=pChater_Value
application("養(yǎng)生主"&"er_Number")=0

dim pRoom_Value(50)
pRoom_Value(0)="逍遙游"&"("&"系統(tǒng)"&")"&"["&application(application("gRoom_Name")&"er_Number")&"]"&"人"
pRoom_Value(1)="養(yǎng)生主"&"("&"系統(tǒng)"&")"&"["&application("養(yǎng)生主"&"er_Number")&"]"&"人"
application("gRoom_Value")=pRoom_Value '用來保存房間的名字
application("gRoom_Number")=2

End Sub

Sub Session_OnStart()
session("sRoom_Name")=application("gRoom_Name")'每個(gè)新用戶的默認(rèn)房間
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 '一個(gè)Recordset的實(shí)例
End Sub

在gloable.asa中進(jìn)行了如上的定義后,我們就可以在后面的頁(yè)面中應(yīng)用了。我們假設(shè)
先有一個(gè)用戶的登陸確認(rèn)(從數(shù)據(jù)庫(kù)中確認(rèn)用戶的信息)大致的代碼如下:
<!--
#include virtual="/chat/inc/Convert.inc"
--> <%'將歡迎的內(nèi)容記入application數(shù)組并調(diào)整順序%>
<!--
#include virtual="/chat/inc/RoomRefresh.inc"
-->
<!--
#include virtual="/chat/inc/Logname.inc"
--> <%'將姓名記入application數(shù)組%>
<%
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)&">"&"請(qǐng)重新登陸"&"</a>"
res.close
else
session("sChater_Name")=name
Welcome_Message="common"&","&"系統(tǒng)"&","&"所有人"&","&"<font color="&chr(34)&"#ff98ff"&chr(34)&">"&"各位看官,"&session("sChater_Name")&"來也"&"</font>"&"<br>"
'這句話請(qǐng)大家一定要注意,如果你讀了我的上一篇文章你應(yīng)該知道是什么意思。
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
%>

下面是三個(gè)關(guān)鍵的子程序,在后面也有大量的應(yīng)用。
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")來保存當(dāng)前的房間名,因此可以被每個(gè)房間的
提交子過程調(diào)用。
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
%>
這個(gè)子程序大家可能不太明白,他是用于顯示各個(gè)房間信息的。
好了,下面是關(guān)鍵的顯示頁(yè)面chatpage.html,它分為三幀,左右為80%,20%,然后
再將右面的分為上下80%,20%,左上的部分就是主的顯示頁(yè)面
showpage.asp
<!--
#include virtual="/chat/inc/Convert.inc"
--> <%'將內(nèi)容記入application數(shù)組并調(diào)整順序%>
<!--
#include virtual="/chat/inc/ChangeRoom.inc"
--> <%'處理?yè)Q房的過程%>
<!--
#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
'大家注意了,這里是關(guān)鍵的關(guān)鍵,房間的顯示與悄悄話的處理都在這里了
代碼是太長(zhǎng)了,但若使用好的數(shù)據(jù)結(jié)構(gòu)應(yīng)該能大大簡(jiǎn)化代碼,我會(huì)用sever端的
javascript來試一試,希望可以
%>
<%
end if
%>
</body>
</html>
好長(zhǎng)哦,^O^,沒辦法,高級(jí)的功能要付出大的代價(jià),我這里是想告訴大家一種思想
以前你肯定定義過application("var1")這樣的變量,但象application(session("sRoom_Name")&"_Value")
這樣的呢???我會(huì)在近期將它做成一個(gè)activex控件,那時(shí)大家就方便了。
想要的話給我寫個(gè)mail就行了。。(出處:熱點(diǎn)網(wǎng)絡(luò))