返回列表 发帖

[ASP] ASP统计在线人数代码

新建global.asa

<script language="vbscript" runat="server">
        sub application_onstart
             application.lock
             application("user_online")=0
             application.unlock
        end sub
      
        sub session_onstart
             application.lock
             application("user_online")=application("user_online")+1
             application.unlock
        end sub
        
        sub session_onend
             application.lock
             application("user_online")=application("user_online")-1
             application.unlock
        end sub
   </script>


新建online.asp
<!--#include file="global.asa"-->
<body topmargin="3" leftmargin="5" bgcolor="#adb6c6">

<p align="left">

<font color="#cc0000"><span style="font-size: 9pt">当前共有</span></font><span style="font-size: 9pt"><font color=#cc0000><b><%=application("user_online")%></b></font></span><font color="#cc0000"><span style="font-size: 9pt">人在线</span></font></p>


在要加在线人数的地方加入
<iframe name="i2" src="../online.asp" scrolling="no" border="0" frameborder="0" width="176" height="17">
欢迎光临:逐梦论坛

TOP

global.asa

<script language="vbscript" runat="server">
sub application_onstart  'application_onstart 当任何客户首次访问该应用程序的首页时运行
        application("activeusercounter") = 0
end sub

sub session_onstart   'session_onstart 当客户首次运行 asp 应用程序中的任何一个页面时运行
        session.timeout = 20  
        application.lock  
        application("activeusercounter") = application("activeusercounter") + 1  
        application.unlock
end sub

sub session_onend   'session_onend 当一个客户的会话超时或退出应用程序时运行
        application.lock  
        application("activeusercounter") = application("activeusercounter") - 1  
        application.unlock  
end sub

sub application_onend   'application_onend 当该站点的 web 服务器关闭时运行

end sub
</script>
欢迎光临:逐梦论坛

TOP

global.asa 文件
我们已经知道application和session对象的onstart、onend事件的脚本,都必须是在 global.asa 文件中声明的。那究竟global.asa是什么样的一个文件?它的作用有何?又该如何运用呢?且听我慢慢道来。

  首先.asa是文件后缀名,它是active server application的首字母缩写。global.asa文件可以管理在asp应用中两个非常苛刻的对象:application、session。

  它其实是一个可选文件,程序编写者可以在该文件中指定事件脚本,并声明具有会话和应用程序作用域的对象。该文件的内容不是用来给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件必须存放在应用程序的根目录内。每个应用程序只能有一个global.asa文件。

  关于global.asa文件最常见的错误概念是它能为一般的使用的函数和子程序用作书库。global.asa文件仅能用于创建对象的引用和俘获启动,以及结束application对象和session对象。

  global.asa文件主要基于会话级事件被访问,在以下三种情况下被调用:
  1,当application_onstart或application_onend事件被触发。
  2,当session_onstart或session_onend事件被触发。
  3,当引用一个在global.asa文件里被实例化的对象(object)。
  global.asa的标准文件格式如下:


<script language="vbscript" runat="server">sub application_onstart  'application_onstart 当任何客户首次访问该应用程序的首页时运行end sub sub session_onstart   'session_onstart 当客户首次运行 asp 应用程序中的任何一个页面时运行end sub sub session_onend   'session_onend 当一个客户的会话超时或退出应用程序时运行end sub sub application_onend   'application_onend 当该站点的 web 服务器关闭时运行end sub </script>

  一、session_onstart
  先看一个控制用户进入页面的代码:
  1,global.asa(放在被调试的虚拟目录的根目录下面)


<script language="vbscript" runat="server">sub session_onstart '只要是用户第一次登录本站,则会跳转到首页response.redirect("htp://www.cnbruce.com/")end sub</script>
  然后调试当前虚拟目录下的任何文件,你会发现所有页面都跳转向htp://www.cnbruce.com/
  通过此“强制进入某页”的例子,可以想象当首页需要被关注的时候是非常有必要的。

  下面就以一个“在线人数”的例子来继续观察session_onstart和session_onend事件。

  二、session_onend
  2,global.asa(放在被调试的虚拟目录的根目录下面)


<script language=vbscript runat=server>sub application_onstart '初始值为0     application("online") = 0 end sub sub session_onstart '一个用户访问进行记数加1     application.lock      application("online") = application("online") + 1      application.unlock end sub sub session_onend '一个用户进程的结束,记数减1 (p.s.如果没有该事件程序,则执行的就是页面访问程序了。)   application.lock    application("online") = application("online") - 1    application.unlock end sub     </script>
  3,online.asp


<%if request.querystring("logout")="true" thensession.abandon()response.endend if%>当前共有<%=application("online")%>在线<a href="/oblog/online.asp?logout=true">退出</a>
  你发现在该页中只有一个application("online",而且还是被显示引用的。那么其值来自何方?这正是global.asa文件的关键所在。
  你可以在本机依次打开个窗口,进行进行关闭窗口或退出两种方法的调试。

  三、继续细化一下
  上面的程序你会发现:当进行“退出”连接后关闭窗口和直接关闭窗口效果是不一样的。因为session存在时间的缘故,当直接进行关闭窗口,并不能触发session_onend事件,所以该如何实现这个几乎不可能的想法呢?

  大家都知道,当网页进行关闭的时候可以连带一个onunload事件,那么该onunload只要能执行session的注销功能不就我们需要的吗?废话少说,将online.asp进行修改。

  3,online.asp


<%if request.querystring("logout")="true" thensession.abandon()response.endend if%><body onunload=javascript:window.open("exit.asp")>当前共有<%=application("online")%>在线<a href="/oblog/online.asp?logout=true">退出</a>
  注意,online.asp进行onunload的时候会打开exit.asp,那只要在exit.asp中再设置_
session.abandon()不就ok了。

  4,exit.asp


<%session.abandon()%><script>self.close()</script>
  当然,加了段script脚本,目的是进行session的注销以后立即进行关闭本身。
  那现在基本一个在线统计的web应用就可以了。

  四、深入研究global.asa
  从上面的调试中,举一反三的你,一定会提出一个问题:如何控制注册用户在线人数?
那下面几个文件一个一个看:

  5,global.asa(放在被调试的虚拟目录的根目录下面)


<script language="vbscript" runat="server">sub application_onstartapplication("online")=0end subsub session_onstartend subsub session_onend if session.contents("pass") then '判断是否为登录用户的session_onend  application.lock  application("online")=application("online")-1  application.unlock end ifend subsub application_onendend sub</script>
  因为一旦有用户访问服务器而不管用户是否登录,都会产生onstart事件,而现在需要的只是登录用户的在线,所以不能在onstart事件里使applicaiton("online"加1。

  又因为不管是否是登录用户的会话结束都会产生onend事件(假如有访客访问了服务器但并不登录,他的会话结束后也会产生onend事件),所以在session_onend事件里用了句if语句来判断是否为已登录用户的onend事件,如果是才将在线人数减1。

  并且值得注意的是:session.contents("pass"的使用,因为在onend事件里禁止使用session对象,但是可以用session对象的集合来调用session变量。也就是说不能直接写session("pass",而是需要写session.contents("pass"。

  6,login.asp


<%if request.querystring("logout")="true" thensession.abandon()end ifsubmitname=request.form("submit")if submitname="submit" then name=request.form("name") pwd=request.form("pwd") if name="cnbruce" and pwd="cnrose" then  session("name")=name  session("pass")=true else  response.write "error name or pwd.<a href="/oblog/login.asp">back</a>"  response.end end ifapplication.lockapplication("online")=application("online")+1application.unlock%>当前注册会员<%=application("online")%>人。<a href="/oblog/login.asp?logout=true">退出</a><%else%><form action="login.asp" method="post"><input type="text" name="name"><br><input type="password" name="pwd"><br><input type="submit" name="submit" value="submit"><%end if%>
  只是简单地检测用名是cnbruce,密码是cnrose的时候,生成一个session("pass"=true,就是放在global.asa中判断的。

  五,继续发挥想象。
  想想,再想想。仅仅统计有多少人在线是不够的,还要判断用户的在线状态。
  可以想象办法基本,当用户登录的时候,在login.asp里将online设为1(如果有数据库则上传),但用户离线时将online设为0,要完善它,就要修改一下session_onend事件,在该事件里将online设为0(同样将为0的值上传)……

  当然,global.asa远远不止这些。不过我们现在先不着急全部掌握,当我们接触到数据库的时候再返回过来看,继续研究该文件,相信到那时一定又会感悟到很多。所以,还是先把上面的这些吃透吧:)
欢迎光临:逐梦论坛

TOP

网页在线人数统计的做法

  在浏览网页的时侯,常常可以看见一些“当前网站上的人数是XXX人”的在线人数同计。如何用ASP来做一个呢?首先,分析一下它的做法,一般来说,这些线上人数统计都是指一个时段内的访客人数统计。比如(5分钟内,10分钟内)而这个时间的长短,是由设计者设定的。

  在这个时段内同计各个不同IP的访客总数,就可以得出当前的线上人数了,但这里有一个精确问题需要解决,至于用什么办法来精确地统计,那就是各人不同的做法了,比如可以用自动提交的页面,隔一段时间读取COOKIES等等,而在ASP中,有一个更好的技巧,就是使用session对象来统计,这里介绍一下gobal.asa这个文件,这是一个很重要的一个文件,请看看它的结构。

<script language="vbscript" runat="server">

sub session_onstart

end sub

sub session_onend

end sub

sub application_onstard

end sub

sub application_onend

end sub</script>

  当有一个会话发生时(用户浏览网页,向web服务器发出请求)那么,如果自服务器启动后第一个用户的话,就会同时发生application_onstard和session_onstart这两个事件,之后,再有别的用户发出请求的话,就只发生session_onstart这个事件,而session的生存期是多长,是可以设定的,session.timeout=X(分钟)

  好了,有了这个很好用的方法,我们就能准确地统计出在线人数了,而人数总计是用一个application变量来保存,当在第一个会话开始时,在application_onstard事件中放置一条清空计数器的语句application("online")=0,然后,在session_onstart事件中,放置一条增加在线人数的语句application("online")=application("online")+1,而在session_onend事件相应地放一条减少在线人数的语句,令计数值减一。

  这样,这个文件就改为如下

<script language="vbscript" runat="server">

sub session_onstart

application("online")=application("online")+1

end sub

sub session_onend

application("online")=application("online")-1

end sub

sub application_onstard

application("online")=0

end sub

sub application_onend

application("online")=0

end sub</script>

  接下来编一个显示图形数字的程序,把在线人数显示在指定的页面上。这样就能得出在人数了

*online.asp

<% @language="vbscript" %>
<%
tmp=application("online")
tmp=cstr(tmp)
dim disp(20)
dim images(20)
dbbits=len(tmp)
for i= 1 to dbbits
disp(i)=left(right(tmp,i),i-(i-1))
next

for i=dbbits to 1 step -1
images(i)="<img src="&"http://xxxx.com.cn/pic"&"/"&disp(i)&".gif>"

response.write "document.write('"&images(i)&"');"

next



%>

  上面的程序很简单,这里不作分析了,请大家自己阅读一下。在调用在线统计的页面上用一句script语句引用online.asp文件,以显示图形统计器。

<script language="javascript" src="http://xxxx.com.cn/online.asp"></script>

  现在可以了,记住要点,你必须把gobal.asa放在正确的web应用程序根目录上,而最好单独为这个统计新建一个web应用程序,不要与其它别的程序混乱了,不然得出的数据是不准确的,而把这个程序修改为多用户的在线统计也很简单。这样就可以提供在线统计服务了,如何实现请又大家去思考一下吧....
欢迎光临:逐梦论坛

TOP

。。

TOP

虽然是用vb写的,但改一下就可以用了。

TOP

TOP

TOP


谢谢啦
好东西要大家分享

TOP

返回列表

Powered by Discuz! 7.2   论坛QQ群:逐梦论坛群

© 2001-2021 Comsenz Inc. 鲁公网安备 37120302000001号