繁体中文
设为首页
加入收藏
当前位置:.Net技术首页 >> Asp.Net开发 >> ASPNET中实现在线用户检测(使用后台守护线程)

ASPNET中实现在线用户检测(使用后台守护线程)

2007-03-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:以下是我的类文件, //online.cs(用户在线检测) /*程序实现思路: 该用户有以下几个属性: name:用户名 sessionID:用户ID,通过它唯一表示一个用户 iswhere :附加信息,用户当前所在位置 lasttime:用户登陆时间 c...

以下是我的类文件,

//online.cs(用户在线检测)

/*程序实现思路:

该用户有以下几个属性:

name:用户名

sessionID:用户ID,通过它唯一表示一个用户

iswhere :附加信息,用户当前所在位置

lasttime:用户登陆时间

curtime:本次刷新时间

在客户端,使用一个IFRAME,装载一个刷新页面,每隔XX秒更新一下他的名字对应的curtime,就表示他仍然在

在服务器端,建立一个守护线程,每隔固定时间就运行一遍,然后判断当前所有用户列表中的时间间隔是否超出了

规定的时间,如果超出,则将该用户从在线列表中删除,这样就可以做到检测用户是否在线了,而如果再单独

写个用户离线后的处理,就可以解决好多人问到的:用户意外吊线后的处理。

*/

#define _debug

namespace Soholife

{

using System;

using System.Data;

using System.Data.SqlClient;

using System.Collections ;

using System.Threading ;

using System.Web;

using System.Diagnostics;

//定义了一个结构

public struct User

{

public string name;

public DateTime lasttime;

public DateTime curtime;

public string sessionid;

public string iswhere;

}

//定义在线用户类

public class OnLineUser

{

private static ArrayList _alluser ; //定义用户

public ArrayList alluser

{

get{return _alluser;}

set{_alluser=value;}

}

public OnLineUser() //构造函数

{

if(_alluser==null)

{

_alluser=new ArrayList();

}

}

//功能说明:将当前用户加入在线列表

//如果该用户的数据当前仍然在在线列表中,则暂时先不让该用户登陆,提示用户存在

public bool AddUserToOnLine(User user)

{

//需要先判断用户是否已经在用户列表中了

if(_alluser==null)

{

_alluser.Add(user);

return (true);

}

else

{

for ( int i = 0 ; i < _alluser.Count ; i ++)

{

//循环判断用户是否已经存在

Soholife.User tempuser = (Soholife.User)_alluser[i] ;

if(tempuser.sessionid.Equals(user.sessionid) && tempuser.name.Equals(user.name))

{

return(false); //用户已经存在,则直接退出

}

}

_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 ++)

{

//循环判断用户是否已经存在

Soholife.User tempuser = (Soholife.User)_alluser[i] ;

if(tempuser.name.Equals(name))

{

return(true) ;

}

}

return (false);

}

}

//功能说明:更新用户在线时间

//返回值:最新的在线用户列表

public Boolean CheckUserOnLine(string name)

{

//需要先判断用户是否已经在用户列表中了

if(_alluser!=null)

{

for ( int i = 0 ; i < _alluser.Count ; i ++)

{

Soholife.User tempuser = (Soholife.User)_alluser[i] ;

//先判断当前用户是否是自己

if(tempuser.name.Equals(name))

{

//更新用户在线时间

tempuser.curtime=DateTime.Now;

alluser[i]=tempuser;

return(true);

}

}

}

return(false);

}

}

/*

下面开始建立守护线程类:

(注:此处,开始写的时候本来想做成单件模式的,不过由于以前没有做过这个东西,所以反而发生

了很多问题,最后决定放弃而使用现有的格式,不过,刚才从开心那里有对单件有个认识,晚上回去

会再去用用它写另一种模式 )

*/

public class CheckOnline

{

const int DELAY_TIMES = 5000 ; //定义执行的时间间隔为5秒

const int DELAY_SECONDS=30; //将用户掉线时间设置为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)

{

Soholife.OnLineUser temp=new Soholife.OnLineUser(); //定义一个用户对象

for (int i=0 ;i< temp.alluser.Count;i++)

{

User tmpuser=(User)temp.alluser[i];

//我是将该用户的最新时间加上80秒,然后和当前时间比较,小与当前时间,

//则表示该用户已经吊线,则删除他的记录

if(tmpuser.curtime.AddSeconds(DELAY_SECONDS).CompareTo(DateTime.Now)<0)

{

temp.alluser.RemoveAt(i);

}

}

Thread.Sleep(DELAY_TIMES) ;

}

}

}

}

编译语句为:csc /t:library /out:../bin/online.dll /r:system.dll online.cs

责任编辑:admin
相关文章