龙空技术网

具有自动刷新功能的实时访客计数器

半成品牛筋面 349

前言:

现时同学们对“ajax定时调取接口数据库”大致比较关心,各位老铁们都需要分析一些“ajax定时调取接口数据库”的相关文章。那么小编在网络上网罗了一些有关“ajax定时调取接口数据库””的相关文章,希望朋友们能喜欢,大家一起来了解一下吧!

我(和我们)的目标是构建一个无需用户干预即可自动刷新的组件(访问者计数器,放置在一个或多个网页中)。

可以使用您喜欢的服务器端技术,例如ASP.NET或PHP,但是,对于本文,我将使用Javascript+ASP.NET:我们在服务器端只需要一个ASPX页面,在客户端只需要一些功能。请记住,该概念可以用您想要的任何语言来实现。

就本文的目的而言,您应该(不是很深入地)了解:JavaScript,AJAX,ASP.NET,以及ASP.NET应用程序,回调函数和UUID的含义。

这个想法如下:我们需要在服务器端维护一个<unique_id,date>对的哈希字典,以便了解每个用户的上次操作时间;当current_time-last_action_time之间的差>30秒时,我们将认为用户已“过期”。显然,我们需要一种从客户端执行“time_stamp”刷新的方法,以避免删除活动用户。

在服务器端,我们只需要:

一种Dictionary<string,date>

一个ASPX页面

服务器端的伪代码如下:

OnApplicationStart:   ActiveUser = {} OnPing(UUID):   if not UUID in ActiveUser      add (UUID,Current_time) in ActiveUser   else      update UUID in ActiveUser with Current_Time12345678复制代码类型:[javascript]

在客户端,我们需要执行一个简单的操作:用户首次进入我们的一个页面时,我们必须为其分配一个唯一的ID。该ID将存储在cookie中。对于以下每个访问,我们只需要读取cookie并将其发送到服务器即可。此外,我们需要一个显示活动用户数量的地方,以及一个用于查询服务器以便检索该数量的功能。因此,在客户端,我们需要:

一个<span>标签:)

一个<javascript>街区

一种允许我们生成唯一ID的方法(我将在本文中提供一个惰性方法)

客户端的伪代码如下:

PageLoad:  UUID = getCookie("MySite_UUID")  if is null UUID    UUID = generate_uuid()    setCookie("MySite_UUID",UUID)    Ping_Server(UUID) Every_5_seconds:   call_server_for_num() Server_Callback(server_data)   document.getElementyById("span1").value= server_data.nuser12345678910111213复制代码类型:[javascript]
使用代码

现在我们可以开始编码:我们创建一个名为serverside.aspx的新页面,其内容如下:

<%@ Page Language="vb" AutoEventWireup="false"    CodeBehind="serverside.aspx.vb" Inherits="RealTimeCouter.serverside" %><%    ' we make sure that counter 'memory' is available    SyncLock Application        Dim ActiveUser As Dictionary(Of String, Date)        ActiveUser = CType(Application("ActiveUser"), Dictionary(Of String, Date))        If IsNothing(ActiveUser) Then            ActiveUser = New Dictionary(Of String, Date)            Application.Add("ActiveUser", ActiveUser)        End If        Application.Add("ActiveUser", ActiveUser)    End SyncLock        ' on PING receive we check if UUID is known    ' then save last action date and time    If Request("TYPE") = "PING" Then                Dim UUID As String = Request("UUID")        SyncLock CType(Application("ActiveUser"), Dictionary(Of String, Date))            If Not CType(Application("ActiveUser"), Dictionary(Of String, Date)).ContainsKey(UUID) Then                CType(Application("ActiveUser"), Dictionary(Of String, Date)).Add(UUID, Date.Now)            Else                CType(Application("ActiveUser"), Dictionary(Of String, Date))(UUID) = Date.Now            End If        End SyncLock            'on QUERY receive we return the number of UUID with     'last action timestamp value <30 sec from current timestamp    ElseIf Request("TYPE") = "QUERY" Then                      Dim nusr As Integer = 0        For Each it As KeyValuePair(Of String, Date) In _               CType(Application("ActiveUser"), Dictionary(Of String, Date))            If Math.Abs(DateDiff(DateInterval.Second, it.Value, Date.Now)) <= 30 Then                nusr += 1            End If        Next it        Response.Write(nusr)        Return            End If  %>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950复制代码类型:[javascript]

再次,创建一个名为clientside.aspx的新ASPX页面,其内容如下:

<%@ Page Language="vb" AutoEventWireup="false"       CodeBehind="clientside.aspx.vb" Inherits="RealTimeCouter.clientside" %><html xmlns=";><head runat="server">    <title></title>        <script type="text/javascript"       language="javascript" src="./utils.js"></script></head><body>        <div>            <span id="nvis">0 </span> visitors    </div>    <script language="javascript" defer="defer">    // Check for UUID of this user    var uuid = getCookie("site_uuid");        if (uuid == "") {        var d = new Date();        var rnd = Math.floor((Math.random() * 100000) + 1);        uuid = rnd + '_' + d.getSeconds() + '_' + d.getMilliseconds() + '_' + d.getMinutes() + '_' + d.getHours();        setCookie("site_uuid", uuid);    }    // send uuid to server (the ping)    var ping = getXMLReq();    ping.open("GET", "./serverside.aspx?TYPE=PING&UUID=" + uuid, true);    ping.send();    // Refresh number of visitors each 5 seconds    setInterval('loadXMLDoc()', 5000);    // Refresh number of visitor at page load    loadXMLDoc();    function loadXMLDoc() {        var xmlhttp = getXMLReq();        xmlhttp.onreadystatechange = function () {                        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {                                document.getElementById("nvis").innerText = xmlhttp.responseText;            }        }        xmlhttp.open("GET", "./serverside.aspx?TYPE=QUERY", true);        xmlhttp.send();        xmlhttp = none;    }</script></body></html>1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253复制代码类型:[javascript]
兴趣点

我们应该注意一些事情:

为了测试代码,您可以使用VS2010在Debug模式下运行项目并启动clientside.aspx:计数器将显示1。随后,您可以使用Chrome浏览器打开更多的“隐身”窗口,从而可以看到访问者数量在增加。如果停止打开新窗口,则可以查看正在减少的访问者数量,因为仅在打开新页面时才启动ping。(您可以更改此行为。)

ASP.NET回收可以清除ActiveUser变量(但这不是问题,因为在下次单击时,将再次对用户进行计数)

utils.js文件包含getCookie,setCookie和getXMLReq函数(为了使代码更简洁)。

服务器端代码可以用PHP实现,并且可以在与客户端不同的网站中运行。

本文随附的项目是使用VS2010Express编写的,但是可以在与.NET2.0兼容的任何IDE中执行。

UUID生成器非常非常懒。在高负载环境中可能会发生一些碰撞。

注意:在不同域之间使用此代码之前,将启用Ajax跨域调用。

标签: #ajax定时调取接口数据库