各位喜欢上网冲浪的朋友一定都去过网易的虚拟社区吧,里面的传呼台功能想必是很得大家的喜爱。通过传呼台,我们能够呼叫任何一个现在在虚拟社区里面冲浪的网友,能够实现在线交谈哦。 
其实,我们使用ASP完万能够实现同网易虚拟社区里面传呼台同样的功能,怎么?不相信?那就跟随我一步一步用ASP来实现网络传呼机吧。 
Active Server Pages(ASP)是服务器端脚本编写 环境,使用他能够创建和运行动态、交互的 Web 服务器应用程式。使用 ASP 能够组合 HTML 页、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web 的功能强大的应用程式。ASP 应用程式很容易研发和修改。 
接下来,我们就开始编写我们的网络传呼机了。 
首先,实现网络传呼的功能有两种方法: 
一. 利用数据库实现传呼信息的保存和处理 
这种方法的长处是,存储信息处理很方便,但是他的缺点也是显而易见的,就是增加了服务器端的负担,因为频繁的存储数据库将会大大增加I/O存取次数,导致网站的连接速度变得缓慢。 
二. 直接使用Application来保存传呼信息 
这种方法的长处是,速度明显快于使用数据库来保存传呼信息的方法;缺点是处理信息比较繁琐,但是很值得的哦,我们首先要确保的是整个网站的性能。 
综合上面的因素,我们将采用第二种方法来编写网络传呼机,对于第一种方法,我会在最后简单介绍一下。 
我们的网络传呼机需要三个页面,也就是“传呼台”页面,“显示传呼信息”页面,“监控传呼机”页面。 
“传呼台”页面(bbsSendBegic.asp)是用来向其他在线用户发送信息的页面,自然就似乎是我们生活中的传呼台喽。 
“显示传呼信息”页面(bbsSendInfo.asp)是在有人呼叫您的时候,弹出来的显示呼叫内容的页面,就像您自己的BP相同,但我们的网络BP机功能更加强劲哦,他能够实时回复别人给您的信息,也能够稍候再回复,或干脆清除掉这条信息。 
“监控传呼机”页面(bbsAutoSearch.asp)是随时监控是否有人呼叫您的页面,就像一个不知疲倦的自动机器人相同一直在监控任何的传呼信息,并且会过滤出来只属于您的传呼信息。 
三个页面之间只有“显示传呼信息”页面和“监控传呼机”页面关系密切, “传呼台”页面是个相对单独的页面,三者关系如下图: 
没有直接关系 显示到”BP机” 
接下来,我们开始编写第一个页面,就是“传呼台”页面。在这个页面里面,我们要实现如下功能: 
1. 取得当前在线的用户列表 
2. 发送信息到传呼信息队列当中进行排队,为以后取出信息做准备 
页面的具体代码如下(bbsSendBegin.asp): 
代码中有周详的注释信息,能够仔细阅读 
<%@ Language=VBScript %> 
<% 
users=split(application("OnlineUser"),",") ‘分割得到当前在线用户的列表,保存到一个数组中 
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 
‘下面将发送的信息送至传呼信息队列当中. 
If trim(application("Message"))="" then 
Application.Lock 
application("Message")=who & "$" & content & "$" & meme ‘放置到传呼信息队列当中 
Application.UnLock 
else 
Application.Lock ‘‘放置到传呼信息队列当中 
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> 
<!-- 得到当前在线用户的列表,并放到下拉列表框中 --> 
<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> 
现在站上只有您一个人喔,无法传送讯息给其他人呀! 
</center> 
<center> 
<a href="javascript:self.close()"><img src="images/close.jpg" ></a> 
</center> 
<%end if%> 
</body> 
</html> 
最终的页面显示为: 
我们将任何在线用户列表放到了一个Application中,即Application("OnlineUser"),并且用逗号隔开每一个用户名称;任何的传呼信息均放到一个Application当中,即Application(“Message”),其中的结构是使用字符“&”隔离开每一个单独的“传呼信息区”,在每一个“传呼信息区”中使用字符“$”依次分割出来这个“传呼信息区”是发送到哪个用户的,内容是什么连同发送者是谁。我们这样做的目的是进行传呼信息处理的时候就很的方便了,只需要使用VBScript内嵌的函数Split()就能够快速方便的处理传呼信息了。 
注意:1. 为了提高性能,我们在同一个页面中实现了静态传呼界面和发送传呼两个功能。 
2. 其中的error.asp,只是个处理出错信息的页面,完万能够用您自己的出错处理页面代替他。 
现在我们再来看看“显示传呼信息”的页面是如何进行编写的。 
在这个页面我们实现的功能有: 
1. 分析传呼信息队列,找到发送到自己的信息,并将他显示出来 
2. 提供稍候再回复,或删除传呼信息,或实时直接回复传呼的功能 
页面的具体代码如下(bbsSendInfo.asp): 
代码中有周详的注释信息,能够仔细阅读 
<%@ 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 
‘因为&,$是传呼信息区的分割符号,所以要过滤掉这些字符,不允许用户输入这些字符 
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 ‘将传呼信息放到传呼信息队列当中 
application("Message")=who & "$" & content & "$" & trim(Request.QueryString("userid")) 
Application.UnLock 
else 
Application.Lock ‘将传呼信息放到传呼信息队列当中 
application("Message")="&" & who & "$" & content & "$" & trim(Request.QueryString("userid")) 
Application.UnLock 
end if 
Response.Write "<script language=javascript>self.close()</script>" 
Response.End 
else 
'************************** 
‘开始分析处理“传呼信息队列”,取得属于自己的传呼信息 
if trim(application("Message"))<>"" then 
msg=split(application("Message"),"&") ‘分割得到传呼信息区,并保存到数组 
for i=0 to ubound(msg) 
if instr(1,trim(msg(i)),trim(Request.QueryString("userid")))>=1 then 
mymsg=split(msg(i),"$") ‘分割得到每个传呼信息区的周详信息 
if trim(mymsg(0))=trim(Request.QueryString("userid")) then ‘这条传呼信息是发给我的! 
msgok=1 ‘有人呼叫我的表记置为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("您不能说\"空话\"喔!"); 
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> 
这个页面的界面是: 
我们通过分析传呼信息队列,提取出来发送到Request.QueryString("userid")的信息,这样 
就得到了我们想要的东西了。至于实现第二个功能,就主要是依靠传递过来的参数:Request.QueryString("act"),这个参数的值有三个:1.send 2.closeme 3.wait 
依次实现的功能就是:1.实时回复传呼信息 2.关闭当前“BP机” 3.稍候再回复信息 
一旦我们回复了传呼信息,我们就会在传呼信息队列当中将这个“传呼信息区”清除掉。实际上就是,使用Replace()函数替换成为空格。 
注意:1.同样的,我们仍然是在一个页面当中整合了显示信息连同发送处理信息两个功能 
2.我们使用一个隐藏的Input框来保存发送传呼的用户名称,以便在同一个页面当中进行处理。 
最后,就是“监控传呼机”页面了,也是和“显示传呼信息”页面 联系最为紧密的一个页面了,只有在“监控传呼机”页面中捕获到了属于您的传呼信息,才会调用“显示传呼信息”页面去显示给您看的,并且,“监控传呼机”页面是需要不停运行的,这点,我们能够使用一个META标签来实现,在这个页面实现的功能就是:分析“传呼信息队列”,找出需要的传呼信息,并调用 
“显示传呼信息”页面来显示到用户的“BP机”上面。 
页面具体的代码如下(bbsAutoSearch.asp): 
代码中有周详的注释信息,能够仔细阅读 
<%@ 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 
'************************** 
‘开始分析处理“传呼信息队列”中的信息,并分割出来是自己的信息 
if trim(application("Message"))<>"" then 
msg=split(application("Message"),"&") ‘分割得到传呼信息区,并保存到数组 
for i=0 to ubound(msg) 
if instr(1,trim(msg(i)),trim(session("userid")))>=1 then 
mymsg=split(msg(i),"$") ‘分割得到每个传呼信息区的周详信息 
if trim(mymsg(0))=trim(session("userid")) then ‘这条传呼信息是发给我的! 
msgok=1‘有人呼叫我的表记置为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("由於超时或操作非法而被管理员踢出系统,请您重新登录!"); 
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> 
我们将当前用户的名称保存在一个Session变量中,即Session(“UserID”) 
我们实现随时刷新的语句其实很简单,就是利用了META标签: 
<meta HTTP-EQUIV="refresh" CONTENT="60;URL=bbsAutoSearch.asp" > 
上面这个标签就表示,要每隔60秒重复刷新自身页面,将这个页面放置到一个隐藏的帧里面,就能够实现随时监控传呼机了。 
这样,我们的网络传呼机就大功告成了! 
怎么样,赶快试一试吧!很好用哦,自然,您能够根据自己的实际情况来增加相应的功能,最终您会完成一个功能十分强大的网络传呼机! 
最后,简单介绍一下使用第一种方法来实现网络传呼机,其实就是处理“传呼信息区”的方法有所不同,由分析Application变成了对数据库的存取,其实质仍然是相同的。但是使用数据库来保存传呼信息队列,会大大方便增强网络传呼机的功能,比如传呼历史信息回顾,自动应答功能等等,这里就不再周详讲解了。 
从上面的例子我们能够看出,ASP的功能是十分强大的,真正学好ASP就能够在网站建设方面任意驰骋了。 
(以上的任何程式在WinNT4.0(SP4)英文版,IIS4.0英文版,IE4.x/IE5.x中文版下测试通过)