代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
CSharp
】
实现用户是否在线代码
作者:
石牌村夫
/ 发布于
2013/12/11
/
669
在Session_Start()和Login()中添加容器中的Session信息,在获取Session信息时更新容器中对应Session条目的最近活动时间,在Logout中删除容易中相应的Session条目
public class OnlineManage { private static OnlineManage _instance = new OnlineManage(); //private Dictionary<int, OnlineUserInfo> _onlineUserList = new Dictionary<int, OnlineUserInfo>(); private Dictionary<string, OnlineUserInfo> _onlineSession = new Dictionary<string, OnlineUserInfo>(); public const int Timeout_Minutes = 20; //非登录会员在线用户过期时间 public const int Timeout_Minutes_Member = 40; //登录会员在线过期时间 private OnlineManage() { } public void Clear() { lock(this) { //_onlineUserList.Clear(); _onlineSession.Clear(); } } /// <summary> /// 获取当前在线用户总数(包含登录和未登录的) /// </summary> public int Count { get { return _onlineSession.Count; } } /// <summary> /// 在线会员数 /// </summary> public int MemberCount { get { int iRet = 0; lock(this) { foreach (string _sKey in _onlineSession.Keys) { OnlineUserInfo oInfo = _onlineSession[_sKey]; if (oInfo == null) { _onlineSession.Remove(_sKey); } else { if (oInfo.UserID>0) { iRet++; } } } } return iRet; } } public OnlineUserInfo this[int UserID] { get { lock(this) { foreach (string _sKey in _onlineSession.Keys) { OnlineUserInfo oInfo = _onlineSession[_sKey]; if (oInfo == null) { _onlineSession.Remove(_sKey); } else { if (oInfo.UserID == UserID) { return oInfo; } } } return null; } } } public OnlineUserInfo this[string sSessionID] { get { if (_onlineSession.ContainsKey(sSessionID)) return _onlineSession[sSessionID]; else return null; } } /// <summary> /// 获取所有当前在线用户的ID数组 /// </summary> public int[] OnlineUserIDs { get { lock(this) { List<int> ids = new List<int>(); foreach(string _sKey in _onlineSession.Keys) { OnlineUserInfo oInfo = this[_sKey]; if(oInfo!=null && oInfo.UserID>0) { ids.Add(oInfo.UserID); } } return ids.ToArray(); } } } /// <summary> /// 用户有活动,存在异常情况: /// 1. Session未结束,但是换了用户登录 /// </summary> /// <param name="UserID"></param> public void UserActived(string sSessionID,int iUserID) { lock (this) { OnlineUserInfo oInfo = this[sSessionID]; if (oInfo == null) { oInfo = new OnlineUserInfo(sSessionID, iUserID); _onlineSession.Add(sSessionID, oInfo); } else { if(oInfo.UserID != iUserID) //考虑同一个页面先后用别的帐号登录 { oInfo.UserID = iUserID; oInfo.LoginTime = DateTime.Now; } oInfo.LastActiveTime = DateTime.Now; } } } /// <summary> /// 用户离开(未活动时间超时或者用户注销了) /// </summary> /// <param name="UserID"></param> public void UserLeaved(string sSessionID,int iUserID) { lock(this) { _onlineSession.Remove(sSessionID); } } /// <summary> /// 用户离开(未活动时间超时或者用户注销了) /// </summary> /// <param name="sSessionID"></param> public void UserLeaved(string sSessionID) { lock (this) { _onlineSession.Remove(sSessionID); } } /// <summary> /// 检查在线用户状态,如果发现有超时未活动的用户,将其删除 /// </summary> public void CheckOnlineUsers() { lock(this) { //1.先查询出需要删除的Key列表 List<string> _removeKeys = new List<string>(); foreach (KeyValuePair<string, OnlineUserInfo> kvp in _onlineSession) { OnlineUserInfo oInfo = kvp.Value; string _sKey = kvp.Key; if(oInfo == null) { _removeKeys.Add(_sKey); } else { if(oInfo.UserID>0) //登录会员 { if (oInfo.NoActiveMinutes > Timeout_Minutes_Member) { _removeKeys.Add(_sKey); } } else //未登录会员 { if (oInfo.NoActiveMinutes > Timeout_Minutes) { _removeKeys.Add(_sKey); } } } } //2.从容器中删除这些Key foreach (string _key in _removeKeys) { _onlineSession.Remove(_key); } _removeKeys.Clear(); } } /// <summary> /// 获取唯一实例 /// </summary> /// <returns></returns> public static OnlineManage GetInstance() { return _instance; } } /// <summary> /// 在线用户信息类 /// </summary> public class OnlineUserInfo { public int UserID; public string SessionID; public DateTime LoginTime; public DateTime LastActiveTime; /// <summary> /// 构造函数,用于用户新登录时创建用户在线条目 /// </summary> /// <param name="iUserID">活动的用户ID</param> /// <param name="dtLoginTime">用户活动时间</param> public OnlineUserInfo(int iUserID,DateTime dtLoginTime) { UserID = iUserID; SessionID = ""; LoginTime = dtLoginTime; LastActiveTime = dtLoginTime; } /// <summary> /// 构造函数,用于用户新登录时创建用户在线条目 /// </summary> /// <param name="iUserID">活动的用户ID</param> /// <param name="dtLoginTime">用户活动时间</param> public OnlineUserInfo(string sSessionID, int iUserID) { UserID = iUserID; LoginTime = DateTime.Now; LastActiveTime = DateTime.Now; SessionID = sSessionID; } /// <summary> /// 用户初次进来并创建了新Session /// </summary> /// <param name="sSessionID"></param> public OnlineUserInfo(string sSessionID) { UserID = 0; LoginTime = DateTime.Now; LastActiveTime = DateTime.Now; SessionID = sSessionID; } /// <summary> /// 获取该用户的未活动时长(分钟数) /// </summary> public int NoActiveMinutes { get { TimeSpan dtSpan = DateTime.Now.Subtract(LastActiveTime); return (int)dtSpan.TotalMinutes; } } /// <summary> /// 获取该用户的在线时长(分钟数) /// </summary> public int OnlineMinutes { get { TimeSpan dtSpan = DateTime.Now.Subtract(LoginTime); return (int)dtSpan.TotalMinutes; } } }
试试其它关键字
用户是否在线
同语言下
.
文件IO 操作类库
.
Check图片类型[JPEG(.jpg 、.jpeg),TIF,GIF,BMP,PNG,P
.
机器名和IP取得(IPV4 IPV6)
.
Tiff转换Bitmap
.
linqHelper
.
MadieHelper.cs
.
RegHelper.cs
.
如果关闭一个窗体后激活另一个窗体的事件或方法
.
创建日志通用类
.
串口辅助开发类
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
石牌村夫
贡献的其它代码
(
16
)
.
远程图片自动上传到服务器
.
实现用户是否在线代码
.
文本框字数(输入还剩多少字)
.
RequiredFieldValidator下拉框验证
.
设置button控件不用页面验证
.
静态页发表评论功能实现
.
最新省市区县数据库
.
Repeater绑定数组
.
页面延时跳转
.
调用外部命令行程序
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3