[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"; } } }