现在的位置: 首页 > 综合 > 正文

统计在线人数

2013年10月14日 ⁄ 综合 ⁄ 共 6127字 ⁄ 字号 评论关闭

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

在BasePage或每个页中加入(new ZKXP.BLL()).CheckOnline()即可。
要获得数据表使用DataTable dt = (DataTable)Application["OnlineTable"]

 

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

namespace ZKXP.BLL
{
    
/// <summary>
    
/// OnLine 的摘要说明。
    
/// </summary>
    public class OnLine
    {    
        
private string USERNAME;
        
private int OFFLINEDIFF;
        
private int REMOVEDIFF;
        

        public OnLine()
        {
            
//直接在这里设定、或从配置文件中读取配置参数
            ///存放用户名的Session名
            USERNAME = "UserName";
            
///多少分钟不活动的用户从在线列表中删除
            OFFLINEDIFF = 5;
            
///多少秒执行一次删除不活动用户
            REMOVEDIFF = 30;
            
            
if(System.Web.HttpContext.Current.Application["OnlineTalbe"== null)
            {
                
this.CashTableInit();
            }
        }

        public void CheckOnline()
        {
            
//从Application获取数据表、获取SessionID
            DataTable dtOnline;
            dtOnline 
= (DataTable)System.Web.HttpContext.Current.Application["OnlineTalbe"];
            
string sessionId = System.Web.HttpContext.Current.Session.SessionID.ToString();
            
            
//数据表中是否有我的记录
            DataRow drFind = dtOnline.Rows.Find(sessionId);
            
if(drFind != null)
            {
                
//有;更新我的状态
                Info.Write("更新");
                drFind[
"LastActiveTime"= DateTime.Now;
                drFind[
"UserWhere"= this.AtWhere;
                
//用户由访客状态变为了登陆会员、或反之
                if(Extend.GetSession(USERNAME) != null)
                {
                    drFind[
"VisitorName"= Extend.GetSession(USERNAME);
                    drFind[
"VisitorLevel"= Extend.GetSession("UserLevel");
                }
                
else
                {
                    drFind[
"VisitorName"= "vst";
                    drFind[
"VisitorLevel"= -1;
                }    
            }
            
else
            {
                
//无;加入关于我的在线信息
                Info.Write("插入");
                DataRow drNew 
= dtOnline.NewRow();
                drNew[
"SessionID"= sessionId;
                drNew[
"VisitorName"= "vst";
                drNew[
"VisitorLevel"= -1;
                drNew[
"LastActiveTime"= DateTime.Now;
                drNew[
"LoginTime"= DateTime.Now;
                drNew[
"VisitorIP"= Extend.GetRealIP();;
                drNew[
"UserWhere"= this.AtWhere;
                
                dtOnline.Rows.Add(drNew);                
            }
            
//如果没有人正在执行删除且离上次删除的时间间隔超过设定值
            TimeSpan tsRemove = DateTime.Now - Convert.ToDateTime(GetApplication("LastRemove"));
            
if(tsRemove.Seconds > REMOVEDIFF && this.GetApplication("Removing").ToString() == "n")
            {
                
//锁定,我正在删除过期用户
                System.Web.HttpContext.Current.Application.Lock();
                SetApplication(
"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();
                SetApplication(
"Removing""n");
                SetApplication(
"LastRemove", DateTime.Now.ToString());
                System.Web.HttpContext.Current.Application.UnLock();
            }
            
            
//把被我揉腻完了的数据表放回Application
            dtOnline.AcceptChanges();
            System.Web.HttpContext.Current.Application.Lock();
            System.Web.HttpContext.Current.Application[
"DataTalbeOnline"= dtOnline;
            System.Web.HttpContext.Current.Application.UnLock();            
        }
        
private string GetApplication(string apcname)
        {
            
return System.Web.HttpContext.Current.Application[apcname].ToString();
        }
        
public void SetApplication(string apcname, string apcvalue)
        {
            
            System.Web.HttpContext.Current.Application[apcname] 
= apcvalue;
            
        }
        
/// <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>
        public void CashTableInit()
        {    
            DataTable dt 
= new DataTable("OnlineTalbe");
            dt.Columns.Add(
"SessionID",typeof(string));
            dt.Columns.Add(
"VisitorName"typeof(string));
            dt.Columns.Add(
"VisitorLevel"typeof(int));
            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";
        }    
    }
}

抱歉!评论已关闭.