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

浙公网安备 33010602011771号