- 打印本文 关闭窗口
- ASP.NET实现用户在线检测的类源码
- 作者:采集员 文章来源:来源于网络 点击数: 更新时间:2005/9/10 14:20:35
- 仍然在在线列表中,则暂时先不让该用户登陆,提示用户存在
public bool AddUserToOnLine(User user)
{
//需要先判断用户是否已经在用户列表中了
if(_alluser==null)
{
_alluser.Add(user);
return (true);
}
else
{
for ( int i = 0 ; i < _alluser.Count ; i ++)
{
//循环判断用户是否已经存在 SohoProject.User tempuser = (SohoProject.User)_alluser[i] ;if( tempuser.sessionid.Equals(user.sessionid))
{
//更新用户在线时间
tempuser.name=user.name;
tempuser.curtime=DateTime.Now;
tempuser.iswhere=user.iswhere;
tempuser.sessionid=user.sessionid;
tempuser.ip=user.ip;
alluser[i]=tempuser;
return(true);
//return(true); //用户已经存在,则直接退出 }
}
_alluser.Add(user);
return (true);
}
}
//功能说明:判断某用户是否在线,本部分暂时不用
//返回值:TRUE代表在线,FALSE不在
public Boolean IsUserOnLine(string name)
{
//需要先判断用户是否已经在用户列表中了
if(_alluser==null)
{
return (false);
}
else
{
for ( int i = 0 ; i < _alluser.Count ; i ++)
{
//循环判断用户是否已经存在 SohoProject.User tempuser = (SohoProject.User)_alluser[i] ;
if(tempuser.name.ToLower().Equals(name.ToLower()))
{
return(true) ;
}
}
return (false);
}
}
//功能说明:更新用户在线时间
//返回值:最新的在线用户列表
public Boolean CheckUserOnLine(string name,string iswhere,string sessionid,string ip)
{
//需要先判断用户是否已经在用户列表中了
if(_alluser!=null)
{
User newuser=new User();
newuser.name= name;
newuser.iswhere= iswhere;
newuser.lasttime=newuser.curtime=DateTime.Now;
newuser.sessionid=sessionid;
newuser.ip=ip;
//OnLineUser alluser= new OnLineUser();
AddUserToOnLine(newuser);
}
return(false);
}
}
/*
下面开始建立守护线程类:
(注:此处,开始写的时候本来想做成单件模式的,不过由于以前没有做过这个东西,所以反而发生
了很多问题,最后决定放弃而使用现有的格式)
*/
public class CheckOnline
{
const int DELAY_TIMES = 10000 ; //定义执行的时间间隔为5秒
const int DELAY_SECONDS=60; //将用户掉线时间设置为30秒
private Thread thread ; //定义内部线程
private static bool _flag=false; //定义唯一标志
public CheckOnline()
{
if (!_flag)
{
_flag= true;
this.thread = new Thread(new ThreadStart(ThreadProc)) ;
thread.Name = "online user" ;
thread.Start() ;
}
}
internal void ThreadProc()
{
while(true)
{
// SohoProject.OnLineUser temp=new SohoProject.OnLineUser(); //定义一个用户对象
// for (int i=0 ;i< temp.alluser.Count;i++)
// {
// User tmpuser=(User)temp.alluser[i];
// //我是将该用户的最新时间加上30秒,然后和当前时间比较,小与当前时间,
// //则表示该用户已经吊线,则删除他的记录
// if(tmpuser.curtime.AddSeconds(DELAY_SECONDS).CompareTo(DateTime.Now)<0)
// {
// temp.alluser.RemoveAt(i);
// }
// }SohoProject.OnLineUser temp=new SohoProject.OnLineUser(); //定义一个用户对象
//开始检查是否有用户过期了 string strExpr;
//tmpuser.curtime.AddSeconds(DELAY_SECONDS).CompareTo(DateTime.Now)<0
strExpr = "curtime < '" + DateTime.Now.AddSeconds( 0 - DELAY_SECONDS) + "'";
#if DEBUG
(new SohoProject.SohoDebug()).WriteToDoc(strExpr);
#endifDataRow[] curUser;
// Use the Select method to find all rows matching the filter.
curUser = temp.alluser.Select(strExpr);if (curUser.Length >0 )
{
//删除这些记录
for(int i = 0; i < curUser.Length; i ++)
{
curUser[i].Delete();
}
temp.alluser.AcceptChanges();
}
Thread.Sleep(DELAY_TIMES) ;
}
}
}
} - 打印本文 关闭窗口