附:原文

发表于:2007-06-30来源:作者:点击数: 标签:
用ASP编写 网络 传呼机 各位喜欢上网冲浪的朋友一定都去过网易的虚拟社区吧,里面的传呼台功能想必是很得大家的喜爱。通过传呼台,我们可以呼叫任何一个目前在虚拟社区里面冲浪的网友,可以实现在线交谈哦。 其实,我们使用ASP完全可以实现同网易虚拟社区里面
用ASP编写网络传呼机

各位喜欢上网冲浪的朋友一定都去过网易的虚拟社区吧,里面的传呼台功能想必是很得大家的喜爱。通过传呼台,我们可以呼叫任何一个目前在虚拟社区里面冲浪的网友,可以实现在线交谈哦。
其实,我们使用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:#clearcase/" target="_blank" >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中文版下测试通过)

原文转自:http://www.ltesting.net