用ASP編寫網絡傳呼機

發布時間:2007年03月07日      浏覽次數:2915 次
用ASP編寫網絡傳呼機
各位喜歡上網沖浪的朋友一(yī)定都去(qù)過網易的虛拟社區吧,裏面的傳呼台功能想必是很得大(dà)家的喜愛。通過傳呼台,我(wǒ)(wǒ)們可以呼叫任何一(yī)個目前在虛拟社區裏面沖浪的網友,可以實現在線交談哦。
其實,我(wǒ)(wǒ)們使用ASP完全可以實現同網易虛拟社區裏面傳呼台同樣的功能,怎麽?不相信?那就跟随我(wǒ)(wǒ)一(yī)步一(yī)步用ASP來實現網絡傳呼機吧。
Active Server Pages(ASP)是服務器端腳本編寫 環境,使用它可以創建和運行動态、交互的 Web 服務器應用程序。使用 ASP 可以組合 HTML 頁、腳本命令和 ActiveX 組件以創建交互的 Web 頁和基于 Web 的功能強大(dà)的應用程序。ASP 應用程序很容易開(kāi)發和修改。
接下(xià)來,我(wǒ)(wǒ)們就開(kāi)始編寫我(wǒ)(wǒ)們的網絡傳呼機了。
首先,實現網絡傳呼的功能有兩種方法:
一(yī).利用數據庫實現傳呼信息的保存和處理
這種方法的優點是,存儲信息處理非常方便,但是它的缺點也是顯而易見的,就是增加了服務器端的負擔,因爲頻(pín)繁的存儲數據庫将會大(dà)大(dà)增加I/O存取次數,導緻網站的連接速度變得緩慢(màn)。
二.直接使用Application來保存傳呼信息
這種方法的優點是,速度明顯快于使用數據庫來保存傳呼信息的方法;缺點是處理信息比較繁瑣,但是很值得的哦,我(wǒ)(wǒ)們首先要保證的是整個網站的性能。

綜合上面的因素,我(wǒ)(wǒ)們将采用第二種方法來編寫網絡傳呼機,對于第一(yī)種方法,我(wǒ)(wǒ)會在最後簡單介紹一(yī)下(xià)。
我(wǒ)(wǒ)們的網絡傳呼機需要三個頁面,也就是“傳呼台”頁面,“顯示傳呼信息”頁面,“監視傳呼機”頁面。
“傳呼台”頁面(bbsSendBegic.asp)是用來向其他在線用戶發送信息的頁面,自然就好像是我(wǒ)(wǒ)們生(shēng)活中(zhōng)的傳呼台喽。
“顯示傳呼信息”頁面(bbsSendInfo.asp)是在有人呼叫你的時候,彈出來的顯示呼叫内容的頁面,就像你自己的BP一(yī)樣,但我(wǒ)(wǒ)們的網絡BP機功能更加強勁哦,他可以即時回複别人給你的信息,也可以稍候再回複,或者幹脆清除掉這條信息。
“監視傳呼機”頁面(bbsAutoSearch.asp)是随時監視是否有人呼叫你的頁面,就像一(yī)個不知(zhī)疲倦的自動機器人一(yī)樣一(yī)直在監視所有的傳呼信息,并且會過濾出來隻屬于你的傳呼信息。
三個頁面之間隻有“顯示傳呼信息”頁面和“監視傳呼機”頁面關系密切, “傳呼台”頁面是一(yī)個相對獨立的頁面,三者關系如下(xià)圖:
“傳呼台”頁面 --- 沒有直接關系 --- “顯示傳呼信息”頁面
顯示到”BP機”<-- “監視傳呼機”頁面 <-- 不斷刷新自身

 接下(xià)來,我(wǒ)(wǒ)們開(kāi)始編寫第一(yī)個頁面,就是“傳呼台”頁面。在這個頁面裏面,我(wǒ)(wǒ)們要實現如下(xià)功能:
1.取得當前在線的用戶列表
2.發送信息到傳呼信息隊列當中(zhōng)進行排隊,爲以後取出信息做準備
頁面的具體(tǐ)代碼如下(xià)(bbsSendBegin.asp):
代碼中(zhōng)有詳細的注釋信息,可以仔細閱讀
<%@ Language=VBScript %>
<%
users=split(application("OnlineUser"),",")‘分(fēn)割得到當前在線用戶的列表,保存到一(yī)個數組中(zhōng)
If trim(request("act"))="wantsend" then‘判斷目前的操作狀态
who=trim(Request.Form("who"))‘得到被呼叫用戶名稱
content=trim(Request.Form("content")) ‘得到呼叫内容
meme=trim(request("userid"))‘得到發送傳呼的用戶名稱
If who="" or content="" then
Response.Redirect "error.asp?msg=姓名或者訊息内容爲空,無法傳送!"
end if
‘下(xià)面将發送的信息送至傳呼信息隊列當中(zhōng).
If trim(application("Message"))="" then
Application.Lock
application("Message")=who & "$" & content & "$" & meme ‘放(fàng)置到傳呼信息隊列當中(zhōng)
Application.UnLock
else
Application.Lock ‘‘放(fàng)置到傳呼信息隊列當中(zhōng)
application("Message")=application("message") & "&" & who & "$" & content & "$" & meme
Application.UnLock
end if
‘發送完畢,關閉頁面
Response.Write "<script language=javascript>self.close();</script>"
end if
%>
<html>
<title>網絡傳呼機</title>
<head>
<script language="javascript">
function check()
{
if(document.send.content.value.length<1)
{
alert("您必須要說兩句喔!");
return;
}
document.send.action="bbsSendBegin.asp?act=wantsend&userid=<%=trim(request("userid"))%>";
document.send.submit();
}
</script>
</head>
<body bgcolor=GhostWhite >
<br>
<center>
網絡傳呼機
</center>
<br>
<%IfUbound(users)>=2 then%>
<center>
<form name="send" method="post">
<table>
 <tr>
<td>送訊息給:</td>
<!--得到當前在線用戶的列表,并放(fàng)到下(xià)拉列表框中(zhōng)-->
<td>
<select name="who">
<%For i=0 to ubound(users)%>
 <%If trim(users(i))<>trim(meme) then%>
<%if i>1 then%>
 <%if users(i)<>users(i-1) then%>
 <option><%=users(i)%>
 <%end if%>
<%else%>
 <%if users(i)<>meme then%>
 <option><%=users(i)%>
 <%end if%>
<%end if%>
 <%end if%>
<%Next%>
</select>
</td>
 </tr>
 <tr>
<td>訊息内容:</td>
<td>
 <input type="text" name="content" size="20" maxlength="50">
</td>
 </tr>
 <tr>
<td colspan="2"> </td>
 </tr>
 <tr>
<td colspan="2">
 <a href="javascript:check()"><img src="images/sendinfo.jpg”></a>
 <a href="javascript:document.send.reset()"><img src="images/rewrite.jpg" ></a>
 <a href="javascript:self.close()"><img src="images/close.jpg" ></a>
</td>
 </tr>
</table>
</form>
</center>
<%else%>
<br>
<br>
<br>
<center>
 目前站上隻有您一(yī)個人喔,無法傳送訊息給其他人呀!
</center>
<center>
<a href="javascript:self.close()"><img src="images/close.jpg" ></a>
</center>
<%end if%>
</body>
</html>
最終的頁面顯示爲:
我(wǒ)(wǒ)們将所有在線用戶列表放(fàng)到了一(yī)個Application中(zhōng),即Application("OnlineUser"),并且用逗号隔開(kāi)每一(yī)個用戶名稱;所有的傳呼信息均放(fàng)到一(yī)個Application當中(zhōng),即Application(“Message”),其中(zhōng)的結構是使用字符“&”隔離(lí)開(kāi)每一(yī)個獨立的“傳呼信息區”,在每一(yī)個“傳呼信息區”中(zhōng)使用字符“$”依次分(fēn)割出來這個“傳呼信息區”是發送到哪個用戶的,内容是什麽以及發送者是誰。我(wǒ)(wǒ)們這樣做的目的是進行傳呼信息處理的時候就非常的方便了,隻需要使用VBScript内嵌的函數Split()就可以快速方便的處理傳呼信息了。
注意:1. 爲了提高性能,我(wǒ)(wǒ)們在同一(yī)個頁面中(zhōng)實現了靜态傳呼界面和發送傳呼兩個功能。
 2. 其中(zhōng)的error.asp,隻是一(yī)個處理出錯信息的頁面,完全可以用您自己的出錯處理頁面代替他。
現在我(wǒ)(wǒ)們再來看看“顯示傳呼信息”的頁面是如何進行編寫的。
在這個頁面我(wǒ)(wǒ)們實現的功能有:
1.分(fēn)析傳呼信息隊列,找到發送到自己的信息,并将它顯示出來
2.提供稍候再回複,或者删除傳呼信息,或者即時直接回複傳呼的功能
頁面的具體(tǐ)代碼如下(xià)(bbsSendInfo.asp):
代碼中(zhōng)有詳細的注釋信息,可以仔細閱讀
<%@ Language=VBScript %>
<%
id=trim(Request.QueryString("userid")) ‘得到當前的用戶名稱,就是自己(等于Session(“UserID”))
if Request.QueryString("act")="send" then ‘獲取當前的操作狀态
 who=trim(Request.Form("who")) ‘如果是發送狀态,就獲取發送到的用戶名稱
 content=trim(Request.Form("content")) ‘如果是發送狀态,就獲取發送的内容
 if who="" or content="" then
 Response.Redirect "error.asp?msg=姓名或者訊息内容爲空,無法傳送!"
 end if
 ‘因爲&,$是傳呼信息區的分(fēn)割符号,所以要過濾掉這些字符,不允許用戶輸入這些字符
 if instr(1,who,"&")>=1 or instr(1,who,"$")>=1 or instr(1,content,"&")>=1 or instr(1,content,"$")>=1 then
 Response.Redirect "error.asp?msg=姓名或者訊息内容包含非法字符($/&),無法傳送!"
 end if

 if trim(application("Message"))="" then
 Application.Lock‘将傳呼信息放(fàng)到傳呼信息隊列當中(zhōng)
 application("Message")=who & "$" & content & "$" &trim(Request.QueryString("userid"))
 Application.UnLock
 else
 Application.Lock ‘将傳呼信息放(fàng)到傳呼信息隊列當中(zhōng)
 application("Message")="&" & who & "$" & content & "$" &trim(Request.QueryString("userid"))
 Application.UnLock
 end if
 Response.Write "<script language=javascript>self.close()</script>"
 Response.End
else
'**************************
‘開(kāi)始分(fēn)析處理“傳呼信息隊列”,取得屬于自己的傳呼信息
if trim(application("Message"))<>"" then
 msg=split(application("Message"),"&")‘分(fēn)割得到傳呼信息區,并保存到數組
 for i=0 to ubound(msg)
 if instr(1,trim(msg(i)),trim(Request.QueryString("userid")))>=1 then
 mymsg=split(msg(i),"$")‘分(fēn)割得到每個傳呼信息區的詳細信息
 if trim(mymsg(0))=trim(Request.QueryString("userid")) then ‘這條傳呼信息是發給我(wǒ)(wǒ)的!
msgok=1‘有人呼叫我(wǒ)(wǒ)的表記置爲1
from=trim(mymsg(2)) ‘獲得傳呼的詳細内容
content=trim(mymsg(1))
sendto=trim(mymsg(0))
 end if
 end if
 next
end if
'****************************
end if
%>
<html>
<title>網絡傳呼機</title>
<head>
<script language="javascript">
function nosend()
{
document.frmmail.action="bbsSendInfo.asp?act=wait&userid=<%=trim(Request.QueryString("userid"))%>"
document.frmmail.submit();
}
function meclose()
{
document.frmmail.action="bbsSendInfo.asp?act=closeme&userid=<%=trim(Request.QueryString("userid"))%>"
document.frmmail.submit();
}
function destory()
{
<% if trim(request("act"))="closeme" then
 cancelme=trim(Request.QueryString("userid")) & "$" & content & "$" & trim(from)
 application.lock
 application("Message")=replace(application("Message"),cancelme,"")
 application.unlock %>
 self.close()
<% end if%>
}
function chkok()
{
if (document.frmmail.content.value=="")
{
alert("您不能說\"空話(huà)\"喔!");
return;
}
document.frmmail.submit();
}
</script>
</head>
<body bgcolor="GhostWhite" onload="javascript:destory();" topmargin="0">
<br>
<form name="frmmail" action="bbsSendInfo.asp?act=send&userid=<%=trim(Request.QueryString("userid"))%>" method="post">
<table border="0" width="200" align="center" cellspacing="1" cellpadding="1">
<tr>
<td colspan="2" align="center">嘻嘻,有人呼你喔...
</tr>
<tr>
<td colspan="2"> </td>
</tr>
<tr>
<td nowrap><%=from%>說:</td>
<td><%=content%></td>
</tr>
<tr>
<td nowrap>回覆内容:</td>
<td><input name="content" size="34" maxlength="35"></td>
</tr>
</table>
<br><br>
<center>
<a href="javascript:chkok();"><img src="images/sendinfo.jpg"></a>
<a href="javascript:document.frmmail.reset()"><img src="images/rewrite.jpg"></a>
<a href="javascript:self.close();"><img src="images/waitsend.jpg"></a>
<a href="javascript:meclose();"><img src="images/close.jpg"></a>
<input name="who" type="hidden" value="<%=from%>">
</center>
</body>
</html>
這個頁面的界面是:
我(wǒ)(wǒ)們通過分(fēn)析傳呼信息隊列,提取出來發送到Request.QueryString("userid")的信息,這樣
就得到了我(wǒ)(wǒ)們想要的東西了。至于實現第二個功能,就主要是依靠傳遞過來的參數:Request.QueryString("act"),這個參數的值有三個:1.send2.closeme3.wait
依次實現的功能就是:1.即時回複傳呼信息2.關閉當前“BP機”3.稍候再回複信息
一(yī)旦我(wǒ)(wǒ)們回複了傳呼信息,我(wǒ)(wǒ)們就會在傳呼信息隊列當中(zhōng)将這個“傳呼信息區”清除掉。實際上就是,使用Replace()函數替換成爲空格。
注意:1.同樣的,我(wǒ)(wǒ)們仍然是在一(yī)個頁面當中(zhōng)集成了顯示信息以及發送處理信息兩個功能
2.我(wǒ)(wǒ)們使用一(yī)個隐藏的Input框來保存發送傳呼的用戶名稱,以便在同一(yī)個頁面當中(zhōng)進行處理。
 最後,就是“監視傳呼機”頁面了,也是和“顯示傳呼信息”頁面 聯系最爲緊密的一(yī)個頁面了,隻有在“監視傳呼機”頁面中(zhōng)捕捉到了屬于你的傳呼信息,才會調用“顯示傳呼信息”頁面去(qù)顯示給你看的,并且,“監視傳呼機”頁面是需要不停運行的,這點,我(wǒ)(wǒ)們可以使用一(yī)個META标簽來實現,在這個頁面實現的功能就是:分(fēn)析“傳呼信息隊列”,找出需要的傳呼信息,并調用
“顯示傳呼信息”頁面來顯示到用戶的“BP機”上面。
頁面具體(tǐ)的代碼如下(xià)(bbsAutoSearch.asp):
代碼中(zhōng)有詳細的注釋信息,可以仔細閱讀
<%@ Language=VBScript %>
<%
'*****************************
user=split(application("OnlineUser"),",") '獲得在線用戶列表
for i=0 to ubound(user) '獲得非空的在線用戶列表
if user(i)<>"" then
nowcount=nowcount+1 '統計在線人數
 if trim(temp)="" then
 temp=user(i)
 else
 temp=temp+","+user(i)
 end if
end if
next
if trim(temp)<>"" then
Application.Lock
application("OnlineUser")=temp '重新整理在線用戶列表
Application.UnLock
end if
%>
<%
dim quit
'**************************
‘開(kāi)始分(fēn)析處理“傳呼信息隊列”中(zhōng)的信息,并分(fēn)割出來是自己的信息
if trim(application("Message"))<>"" then
 msg=split(application("Message"),"&")‘分(fēn)割得到傳呼信息區,并保存到數組
 for i=0 to ubound(msg)
 if instr(1,trim(msg(i)),trim(session("userid")))>=1 then
 mymsg=split(msg(i),"$")‘分(fēn)割得到每個傳呼信息區的詳細信息
 if trim(mymsg(0))=trim(session("userid")) then‘這條傳呼信息是發給我(wǒ)(wǒ)的!
msgok=1‘有人呼叫我(wǒ)(wǒ)的表記置爲1
from=trim(mymsg(2))‘獲得傳呼的詳細内容
content=trim(mymsg(1))
sendto=trim(mymsg(0))
 end if
 end if
 next
end if
'****************************
quit=0
if (trim(session("UserID"))="" or instr(1,application("OnlineUser"),session("UserID"))<1) and trim(session("UserID"))<>"guest" then
quit=1
else
 if trim(application("OnlineUser"))="" then
 counts=0
 else
counts=ubound(split(application("OnlineUser"),","))+1
 end if
end if
%>
<HTML>
<HEAD>
<meta HTTP-EQUIV="refresh" CONTENT="60;URL=bbsAutoSearch.asp"charset=gb2312 >
<script language=javascript>
function window_onload()
{
//**************
//在這裏就調用了“顯示傳呼信息”的頁面進行信息的顯示
<%if msgok=1 then%>
 mail=" 網 絡 傳 呼 機\n\n"+"<%=from%>"+"對您說:\n\n"+"<%=content%>";
sendinfo=window.open("bbssendinfo.asp?userid=<%=session("UserID")%>","SendInfo","toolbar=no,width=360,height=200,top=0,left=0");
<%end if%>
//**************
//如果當前用戶超時,就踢出系統
<%if quit=1 then%>
alert("由於超時或者操作非法而被管理員(yuán)踢出系統,請您重新登錄!");
document.kickout.target="_top";
document.kickout.submit();
<%end if%>
}
</script>
</HEAD>
<BODY style="BACKGROUND-color:#ccccff" onload="javascript:window_onload()">
<%if quit=1 then%>
<center>
超時或者操作非法!
</center>
<%else%>
<%if session("UserID")<>"guest" then%>
<center>
 目前在線用戶:<font color=red><b><%=counts%></b></font>人
</center>
<%else%>
<center>
 注冊用戶才可發表文章.
</center>
<%end if%>
<%end if%>
<form name=kickout method=post action="bbslogin.asp"></form>
</BODY>
</HTML>
我(wǒ)(wǒ)們将當前用戶的名稱保存在一(yī)個Session變量中(zhōng),即Session(“UserID”)
我(wǒ)(wǒ)們實現随時刷新的語句其實很簡單,就是利用了META标簽:
<meta HTTP-EQUIV="refresh" CONTENT="60;URL=bbsAutoSearch.asp" >
上面這個标簽就表示,要每隔60秒重複刷新自身頁面,将這個頁面放(fàng)置到一(yī)個隐藏的幀裏面,就可以實現随時監視傳呼機了。
這樣,我(wǒ)(wǒ)們的網絡傳呼機就大(dà)功告成了!
怎麽樣,趕快試一(yī)試吧!很好用哦,自然,你可以根據自己的實際情況來增加相應的功能,最終你會完成一(yī)個功能十分(fēn)強大(dà)的網絡傳呼機!
最後,簡單介紹一(yī)下(xià)使用第一(yī)種方法來實現網絡傳呼機,其實就是處理“傳呼信息區”的方法有所不同,由分(fēn)析Application變成了對數據庫的存取,其實質仍然是一(yī)樣的。但是使用數據庫來保存傳呼信息隊列,會大(dà)大(dà)方便增強網絡傳呼機的功能,比如傳呼曆史信息回顧,自動應答功能等等,這裏就不再詳細講解了。
從上面的例子我(wǒ)(wǒ)們可以看出,ASP的功能是十分(fēn)強大(dà)的,真正學好ASP就可以在網站建設方面任意馳騁了。
(以上的所有程序在WinNT4.0(SP4)英文版,IIS4.0英文版,IE4.x/IE5.x中(zhōng)文版下(xià)測試通過)
免責聲明:本站相關技術文章信息部分(fēn)來自網絡,目的主要是傳播更多信息,如果您認爲本站的某些信息侵犯了您的版權,請與我(wǒ)(wǒ)們聯系,我(wǒ)(wǒ)們會即時妥善的處理,謝謝合作!