发一个在线用户统计的代码

lawbc 2009-04-12 03:41:53

/// <summary>
/// 用户基础类
/// </summary>
public class OnlineUser
{
#region 私有字段

private string id;
private string name = "游客";
private DateTime startTime = DateTime.Now;
private DateTime lastTime = DateTime.Now;
private string lastIP;
private bool isUser = false;
private string lastUrl;

#endregion

#region 公共属性

/// <summary>
/// 获取或设置用户名
/// </summary>
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}

/// <summary>
/// 获取或设置ID
/// </summary>
public string ID
{
get
{
return id;
}
set
{
id = value;
}
}

/// <summary>
/// 获取或设置开始访问时间
/// </summary>
public DateTime StartTime
{
get
{
return startTime;
}
set
{
startTime = value;
}
}

/// <summary>
/// 获取或设置最后访问时间
/// </summary>
public DateTime LastTime
{
get
{
return lastTime;
}
set
{
lastTime = value;
}
}

/// <summary>
/// 获取或设置是否会员(True会员False游客)
/// </summary>
public bool IsUser
{
get
{
return isUser;
}
set
{
isUser = value;
}
}
/// <summary>
/// 获取或设置用户IP
/// </summary>
public string LastIP
{
get
{
return lastIP;
}
set
{
lastIP = value;
}
}

/// <summary>
/// 获取或设置最后请求网址
/// </summary>
public string LastUrl
{
get
{
return lastUrl;
}
set
{
lastUrl = value;
}
}

/// <summary>
/// 获取在线时间(秒)
/// </summary>
public double OnlineSeconds
{
get
{
return (lastTime - startTime).TotalSeconds;
}
}

#endregion

}

以上代码在网上下载的,但是经过本人修改。
帮忙看看有什么问题没
...全文
714 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
感觉还不错
xinqq163 2010-07-28
  • 打赏
  • 举报
回复
51aspx下载 发下载网址呀
flyerwing 2010-04-04
  • 打赏
  • 举报
回复
这个是通用权限管理系统里的一部分!!
不过简化了!
huangwenquan123 2010-04-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 ws_hgo 的回复:]
不错
[/Quote]不错
ws_hgo 2009-04-12
  • 打赏
  • 举报
回复
不错
wuyq11 2009-04-12
  • 打赏
  • 举报
回复
不错。
jdbcodbc 2009-04-12
  • 打赏
  • 举报
回复
为什么不用AJAX的心跳包
zhuangjunx 2009-04-12
  • 打赏
  • 举报
回复
试试
wanhot 2009-04-12
  • 打赏
  • 举报
回复
一点特点没有,不怎么地
myrroom 2009-04-12
  • 打赏
  • 举报
回复
试试
qqshenyunzcz 2009-04-12
  • 打赏
  • 举报
回复
光代码 我怎么测试啊?
你怎么不能测试了? 怪哦
lawbc 2009-04-12
  • 打赏
  • 举报
回复
51aspx下载的啊,改了点
帮忙测试下
winsei 2009-04-12
  • 打赏
  • 举报
回复
很好很强大,你写的?
lawbc 2009-04-12
  • 打赏
  • 举报
回复

#region 私有方法

/// <summary>
/// 重建用户列表排序
/// </summary>
/// <param name="UserNode"></param>
private void ReNewUser(LinkedListNode<OnlineUser> UserNode)
{
if (UserNode.List != null)
{
UserNode.List.Remove(UserNode);
}
_OnlineUserLink.AddFirst(UserNode);
UserNode.Value.LastTime = DateTime.Now;
}

/// <summary>
/// 重建
/// </summary>
/// <param name="UserNode"></param>
/// <param name="U_LastUrl"></param>
private void ReNewUser(LinkedListNode<OnlineUser> UserNode, string U_LastUrl)
{
if (UserNode.List != null)
{
UserNode.List.Remove(UserNode);
}
_OnlineUserLink.AddFirst(UserNode);
UserNode.Value.LastTime = DateTime.Now;
UserNode.Value.LastUrl = U_LastUrl;
}

/// <summary>
/// 清除到期在线用户
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ClearTimeOutUser(object sender, System.Timers.ElapsedEventArgs e)
{
double NextRunTime = timeOut;
DateTime _CheckTime = e.SignalTime.AddMilliseconds(timeOut * -1);
_UpdateTimer.Stop();
try
{
readerWriterLock.AcquireWriterLock(Timeout.Infinite);
if (_OnlineUserLink.Count > 0)
{
LinkedListNode<OnlineUser> UserNode = _OnlineUserLink.Last;
TimeSpan ts = UserNode.Value.LastTime - _CheckTime;
if (ts.TotalMilliseconds <= 0)
{
if (UserNode.Previous != null)
{
ts = UserNode.Previous.Value.LastTime - _CheckTime;
if (ts.TotalMilliseconds <= 0)
NextRunTime = 1;
else
NextRunTime = ts.TotalMilliseconds;
}
Remove(UserNode);
}
else
{
NextRunTime = ts.TotalMilliseconds;
}
}
_UpdateTimer.Interval = NextRunTime;
}
finally
{
readerWriterLock.ReleaseWriterLock();
}
_UpdateTimer.Start();
}

#endregion

}

lawbc 2009-04-12
  • 打赏
  • 举报
回复

#region 公共方法

/// <summary>
/// 插入用户
/// </summary>
/// <param name="onlineUser">用户</param>
public void Add(OnlineUser onlineUser)
{
LinkedListNode<OnlineUser> listNode = new LinkedListNode<OnlineUser>(onlineUser);
try
{
readerWriterLock.AcquireWriterLock(Timeout.Infinite);

if (allUserList.ContainsKey(onlineUser.ID))
{
ReNewUser(listNode);
}
else
{
if (onlineUser.IsUser)
{
if (!userList.ContainsKey(onlineUser.ID))
{
userList.Add(onlineUser.ID, listNode);
allUserList.Add(onlineUser.ID, listNode);
ReNewUser(listNode);
}
else
{
ReNewUser(listNode);
}
}
else
{
allUserList.Add(onlineUser.ID, listNode);
ReNewUser(listNode);
}
}
}
finally
{
readerWriterLock.ReleaseWriterLock();
}
}

/// <summary>
/// 更新用户请求信息
/// </summary>
/// <param name="id">id</param>
public void Update(string id)
{
LinkedListNode<OnlineUser> OutNodeUser;
try
{
readerWriterLock.AcquireWriterLock(Timeout.Infinite);

if (allUserList.TryGetValue(id, out OutNodeUser))
{
ReNewUser(OutNodeUser);
}
}
finally
{
readerWriterLock.ReleaseWriterLock();
}
}

/// <summary>
/// 访问请求
/// </summary>
/// <param name="id">id</param>
/// <param name="url">url</param>
public void Update(string id, string url)
{
LinkedListNode<OnlineUser> OutNodeUser;
try
{
readerWriterLock.AcquireWriterLock(Timeout.Infinite);

if (allUserList.TryGetValue(id, out OutNodeUser))
{
ReNewUser(OutNodeUser, url);
}
}
finally
{
readerWriterLock.ReleaseWriterLock();
}
}

/// <summary>
/// 根据id移除用户
/// </summary>
/// <param name="id">id</param>
public void Remove(string id)
{
LinkedListNode<OnlineUser> UserNode;
try
{
readerWriterLock.AcquireWriterLock(Timeout.Infinite);
if (allUserList.TryGetValue(id, out UserNode))
{
Remove(UserNode);
}

}
finally
{
readerWriterLock.ReleaseWriterLock();
}
}

/// <summary>
/// 移除用户资料
/// </summary>
/// <param name="UserNode"></param>
private void Remove(LinkedListNode<OnlineUser> UserNode)
{
if (UserNode.List != null)
{
allUserList.Remove(UserNode.Value.ID);
if (UserNode.Value.IsUser)
userList.Remove(UserNode.Value.ID);
UserNode.List.Remove(UserNode);
}
}

/// <summary>
/// 获取在线用户列表
/// </summary>
public IList<OnlineUser> GetOnlineUsers()
{
readerWriterLock.AcquireReaderLock(Timeout.Infinite);
IList<OnlineUser> lst = new List<OnlineUser>();
foreach (OnlineUser var in _OnlineUserLink)
{
lst.Add(var);
}
readerWriterLock.ReleaseReaderLock();
return lst;
}

/// <summary>
/// 获取用户信息
/// </summary>
/// <param name="name">id</param>
/// <returns></returns>
public OnlineUser GetOnlineUser(string id)
{
OnlineUser value = default(OnlineUser);
LinkedListNode<OnlineUser> NodeUser;
try
{
readerWriterLock.AcquireReaderLock(Timeout.Infinite);
if (userList.TryGetValue(id, out NodeUser))
{
value = NodeUser.Value;
}
}
finally
{
readerWriterLock.ReleaseReaderLock();
}
return value;
}

/// <summary>
/// 根据用户名检测是否在线
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public bool IsOnlineUser(string id)
{
bool rBool = false;
try
{
readerWriterLock.AcquireReaderLock(Timeout.Infinite);
if (userList.ContainsKey(id))
{
rBool = true;
}
}
finally
{
readerWriterLock.ReleaseReaderLock();
}
return rBool;
}

/// <summary>
/// 清除所有在线人数
/// </summary>
public void Clear()
{
readerWriterLock.AcquireWriterLock(Timeout.Infinite);
userList.Clear();
allUserList.Clear();
_OnlineUserLink.Clear();
readerWriterLock.ReleaseWriterLock();
}

#endregion

lawbc 2009-04-12
  • 打赏
  • 举报
回复

/// <summary>
/// 用户在线类
/// </summary>
/// <typeparam name="string">Key</typeparam>
/// <typeparam name="OnlineUser">值</typeparam>
public class CacheOnline
{

#region 私有字段

private static CacheOnline instance;
private static readonly object syncRoot = new object();

//会员列表
private Dictionary<string, LinkedListNode<OnlineUser>> userList;
//所有人数列表
private Dictionary<string, LinkedListNode<OnlineUser>> allUserList;
//所有会员列表排序
private LinkedList<OnlineUser> _OnlineUserLink;
/// <summary>
/// Cache锁
/// </summary>
protected ReaderWriterLock readerWriterLock = new ReaderWriterLock();
//定时器
private System.Timers.Timer _UpdateTimer;
//登陆超时时间(毫秒)
private int timeOut=1000 * 60 * 30;

#endregion

#region 构造函数

/// <summary>
/// 构造函数
/// </summary>
private CacheOnline()
{
userList = new Dictionary<string, LinkedListNode<OnlineUser>>();
allUserList = new Dictionary<string, LinkedListNode<OnlineUser>>();
_OnlineUserLink = new LinkedList<OnlineUser>();
_UpdateTimer = new System.Timers.Timer();
_UpdateTimer.AutoReset = true;
_UpdateTimer.Elapsed += new System.Timers.ElapsedEventHandler(ClearTimeOutUser);
_UpdateTimer.Interval = timeOut;
_UpdateTimer.Start();
}

#endregion

#region 公共属性

/// <summary>
/// 获取所有用户总数
/// </summary>
public int AllCount
{
get
{
return allUserList.Count;
}
}

/// <summary>
/// 获取会员总数
/// </summary>
public int MemberCount
{
get
{
return userList.Count;
}
}

/// <summary>
/// 获取或设置登陆超时时间(毫秒)
/// </summary>
public int TimeOut
{
get
{
return timeOut;
}
set
{
timeOut=value;
}
}

/// <summary>
/// 获取一个对象实例,该对象在整个运用程序中唯一
/// </summary>
/// <returns></returns>
public static CacheOnline GetInstance()
{
if (instance == null)
{

lock (syncRoot)
{

if (instance == null)
{
instance = new CacheOnline();
}
}
}
return instance;
}

#endregion

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧