注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

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

2015-01-26 09:54:59|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

文章出处:网上收集 作者:未知 发布时间:2000-11-30

注:如本站转载的教程文章涉及版权等问题,请作者与我联系,我将在第一时间删除! 联系E-mail:点击邮我

?ASP.NET MVC :实现我们自己的视图引擎
?WPF自定义漂亮的按钮样式
?装箱、转型、方法调用他们究竟有什么区别?
?使用Ajax后,原来导出功能失败的解决方法
?ASP.NET将物件序列化成Binary储存至DB or F
关键词:ASPNET中实现在线用户检测(使用后台守护线程)
以下是我的类文件,
//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) ;
??????????? }
??????? }
??? }
}

  评论这张
 
阅读(187)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017