打印本文 打印本文  关闭窗口 关闭窗口
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);
#endif

    DataRow[] 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) ;
            }
        }
    }
}

 

上一页  [1] [2] 



打印本文 打印本文  关闭窗口 关闭窗口