首页  ·  知识 ·  云计算
实现用户是否在线代码
佚名  http://www.cnblogs.com/caojinqin/  综合  编辑:dezai  图片来源:网络
postBody> "FONT-FAMILY: 宋体"> "FONT-FAMILY: arial,helvetica,sans-serif"> "COLOR: #0000ff">public

public class OnlineManage
{
   
private static OnlineManage _instance = new
OnlineManage();
   
//private Dictionary _onlineUserList = new Dictionary();

    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();
        }
    }

   
///


   
/// 获取当前在线用户总数(包含登录和未登录的)
   
///

    public int Count
    {
       
get { return
_onlineSession.Count; }
    }

   
///
   
/// 在线会员数
   
///

    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;
        }
    }

   
///
   
/// 获取所有当前在线用户的ID数组
   
///

    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();
            }
        }
    }

   
///
   
/// 用户有活动,存在异常情况:
   
///
1. Session未结束,但是换了用户登录
   
///

   
///
    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;
            }
        }
    }

   
///
   
/// 用户离开(未活动时间超时或者用户注销了)
   
///

   
///
    public void UserLeaved(string sSessionID,int iUserID)
    {
       
lock(this
)
        {
            _onlineSession.Remove(sSessionID);
        }
    }

   
///
   
/// 用户离开(未活动时间超时或者用户注销了)
   
///

   
///
    public void UserLeaved(string sSessionID)
    {
       
lock (this
)
        {
            _onlineSession.Remove(sSessionID);
        }
    }


   
///
   
/// 检查在线用户状态,如果发现有超时未活动的用户,将其删除
   
///

    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();
        }
    }

   
///
   
/// 获取唯一实例
   
///

   
///
    public static OnlineManage GetInstance()
    {
       
return
_instance;
    }
}

///
/// 在线用户信息类
///

public class OnlineUserInfo
{
   
public int
UserID;
   
public string
SessionID;
   
public
DateTime LoginTime;
   
public
DateTime LastActiveTime;

   
///
   
/// 构造函数,用于用户新登录时创建用户在线条目
   
///

   
/// 活动的用户ID
   
/// 用户活动时间
    public OnlineUserInfo(int iUserID,DateTime dtLoginTime)
    {
        UserID
=
iUserID;
        SessionID
= ""
;
        LoginTime
=
dtLoginTime;
        LastActiveTime
=
dtLoginTime;
    }

   
///
   
/// 构造函数,用于用户新登录时创建用户在线条目
   
///

   
/// 活动的用户ID
   
/// 用户活动时间
    public OnlineUserInfo(string sSessionID, int iUserID)
    {
        UserID
=
iUserID;
        LoginTime
=
DateTime.Now;
        LastActiveTime
=
DateTime.Now;
        SessionID
=
sSessionID;
    }

   
///
   
/// 用户初次进来并创建了新Session
   
///

   
///
    public OnlineUserInfo(string sSessionID)
    {
        UserID
= 0
;
        LoginTime
=
DateTime.Now;
        LastActiveTime
=
DateTime.Now;
        SessionID
=
sSessionID;
    }

   
///
   
/// 获取该用户的未活动时长(分钟数)
   
///

    public int NoActiveMinutes
    {
       
get

        {
            TimeSpan dtSpan
= DateTime.Now.Subtract(LastActiveTime);
           
return (int
)dtSpan.TotalMinutes;
        }
    }

   
///
   
/// 获取该用户的在线时长(分钟数)
   
///

    public int OnlineMinutes
    {
       
get

        {
            TimeSpan dtSpan
= DateTime.Now.Subtract(LoginTime);
           
return (int
)dtSpan.TotalMinutes;
        }
    }
}

 
本文作者:佚名 来源:http://www.cnblogs.com/caojinqin/
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读