[C#]统计在线人数

参考原文:http://zkxp.cnblogs.com/archive/2006/03/31/363438.html

引用原文:鹅用的是AC数据库,曾经在ASP时代试验过,做的使用数据库临时表,人数上了100就比较艰难了(因为同时还在不停的查询另外个BANNER表所以实际上是上了200),后来我飒是费了点劲将数据表转换为多维数组放到APPLICATION里去然后间隔时间更新至数据库,得以缓解。现在而今眼目下鸟枪换炮了用.net可以直接把DataTable放到Application里面。很好。极大减少数据库压力了,尤其是我使用的AC数据库-_-!。至于要实现1个ID1个登陆只要查询表中是否有该用户名的记录就可以了。
还没完善目前还在调试修正中。。。

本文内容:

在母版页或每个用户页中加入以下代码:

JackyLong.LibOnlineUser OL = new JackyLong.LibOnlineUser();
OL.CheckOnline();

列表页可使用GridView,绑定代码如下:

System.Data.DataTable dt = (System.Data.DataTable)Application["OnlineTalbe"];
OLTable.DataSource = dt;
OLTable.DataBind();

  

类库代码:

using System;
using System.Data;
using System.Text;

namespace JackyLong
{
    /// <summary>
    /// LibOnlineUser 的摘要说明。
    /// </summary>
    public class LibOnlineUser
    {
        public void CheckOnline()
        {
        string USERNAME;
        int OFFLINEDIFF;
        int REMOVEDIFF;

            //直接在这里设定、或从配置文件中读取配置参数
            ///获取Session中的用户名
            if (System.Web.HttpContext.Current.Session["UserName"] != null)
            {
                USERNAME = System.Web.HttpContext.Current.Session["UserName"].ToString();
            }
            else
            {
                USERNAME = "游客";
            }
            ///多少分钟不活动的用户从在线列表中删除
            OFFLINEDIFF = 5;
            ///多少秒执行一次删除不活动用户
            REMOVEDIFF = 30;
             
            if(System.Web.HttpContext.Current.Application["OnlineTalbe"] == null)
            {
                this.OnlineTalbeInit();
            }
            //从Application获取数据表、获取SessionID
            DataTable dtOnline = (DataTable)System.Web.HttpContext.Current.Application["OnlineTalbe"];
            string SsId = System.Web.HttpContext.Current.Session.SessionID.ToString();
            
            //数据表中是否有我的记录
            DataRow drFind = dtOnline.Rows.Find(SsId);
            if(drFind != null)
            {
                //有;更新我的状态
                drFind["VisitorName"] = USERNAME;
                drFind["LastActiveTime"] = DateTime.Now;
                drFind["UserWhere"] = this.AtWhere;
            }
            else
            {
                //无;加入关于我的在线信息
                DataRow drNew = dtOnline.NewRow();
                drNew["SessionID"] = SsId;
                drNew["VisitorName"] = USERNAME;
                drNew["LastActiveTime"] = DateTime.Now;
                drNew["LoginTime"] = DateTime.Now;
                drNew["VisitorIP"] = System.Web.HttpContext.Current.Request.UserHostAddress;
                drNew["UserWhere"] = this.AtWhere;
                
                dtOnline.Rows.Add(drNew);
            }
            //如果没有人正在执行删除且离上次删除的时间间隔超过设定值
            TimeSpan tsRemove = DateTime.Now - Convert.ToDateTime(System.Web.HttpContext.Current.Application["LastRemove"].ToString());
            if(tsRemove.Seconds > REMOVEDIFF && System.Web.HttpContext.Current.Application["Removing"].ToString() == "n")
            {
                //锁定,我正在删除过期用户
                System.Web.HttpContext.Current.Application.Lock();
                System.Web.HttpContext.Current.Application["Removing"] = "y";
                System.Web.HttpContext.Current.Application.UnLock();
                //不知道Rows.Count是否随循环减少,如果是效率就大于foreach且这里不能使用foreach
                for(int i=0; i< dtOnline.Rows.Count; i++ )
                {
                    DataRow drDel = dtOnline.Rows[i];
                    TimeSpan ts= DateTime.Now - Convert.ToDateTime(drDel["LastActiveTime"]);
                    if(ts.Minutes > OFFLINEDIFF)
                    {
                        dtOnline.Rows.Remove(drDel);
                    }
                }

                //我删完了,Response.Write("好累") ;
                System.Web.HttpContext.Current.Application.Lock();
                System.Web.HttpContext.Current.Application["Removing"] = "n";
                System.Web.HttpContext.Current.Application["LastRemove"] = DateTime.Now.ToString();
                System.Web.HttpContext.Current.Application.UnLock();
            }
             
            //把被我揉腻完了的数据表放回Application
            dtOnline.AcceptChanges();
            System.Web.HttpContext.Current.Application.Lock();
            System.Web.HttpContext.Current.Application["OnlineTalbe"] = dtOnline;
            System.Web.HttpContext.Current.Application.UnLock();
        }
        /// <summary>
        /// 返回用户当前位置
        /// </summary>
        private string AtWhere
        {
            get
            {   System.Text.StringBuilder sb = new System.Text.StringBuilder();
                sb.Append(System.Web.HttpContext.Current.Request.ServerVariables["url"]);
                if(System.Web.HttpContext.Current.Request.ServerVariables["QUERY_STRING"] != String.Empty)
                {
                    sb.Append("?");
                    sb.Append(System.Web.HttpContext.Current.Request.ServerVariables["QUERY_STRING"]);
                }
                return sb.ToString();
            }
        }
        /// <summary>
        /// 初始化:创建在线用户表
        /// </summary>
        private void OnlineTalbeInit()
        {
            DataTable dt = new DataTable("OnlineTalbe");
            dt.Columns.Add("SessionID", typeof(string));
            dt.Columns.Add("VisitorName", typeof(string));
            dt.Columns.Add("LastActiveTime", typeof(DateTime));
            dt.Columns.Add("LoginTime", typeof(DateTime));
            dt.Columns.Add("VisitorIP", typeof(string));
            dt.Columns.Add("UserWhere", typeof(string));
            dt.Columns["SessionID"].Unique = true;
            dt.PrimaryKey = new DataColumn[]{dt.Columns["SessionID"]};

            System.Web.HttpContext.Current.Application["OnlineTalbe"] = dt;
            System.Web.HttpContext.Current.Application["LastRemove"] = DateTime.Now.ToString();
            System.Web.HttpContext.Current.Application["Removing"] = "n";
        }
    }
}

  

posted @ 2011-09-21 16:52  村口野狼  阅读(425)  评论(0编辑  收藏  举报