asp.net判断离线在线状态
2014/03/25 (红太狼结婚了)
参考源码:http://www.bokee.net/bloggermodule/blog_viewblog.do?id=4207973
1.解决内容:增加会员在线或离线功能
解决动机:威客圈做任务需要商家和刷客进行有效的配合,这样能够提高做任务的效率。让商家和刷客知道彼此是否在线,有利于任务的顺利进行,也可以让刷客进行选择任务接受的判断,商家如果有事离开,也可以进行隐身和退出系统离线操作。对等待接受任务的刷客做出状态的反馈!
解决方法:
1.在会员表中增加一个IsOnLine的字段,设置为Boole类型;0为离线,1为在线。
2.当登录系统成功后,通过js setoutTime 方法每10秒中向一个一般处理程序发出ajax请求。这个请求的发送页可以写在模版页或者不能被关闭的页面,保证10秒中可以对后台做出请求。
3.一般处理程序是用来记录登录会员发送过来的最后时间,把会员和时间通过键值对的方式保存到一个Hashtable 表中,如果会员存在则更新它的时间,不存在就记录其中。
/// <summary>
/// 获取或设置在线列表
/// </summary>
public Hashtable OnlineUserList
{
get
{
if( HttpContext.Current.Application["OnlineUserList"] == null)
{
Hashtable onlineUserList = new Hashtable();
HttpContext.Current.Application["OnlineUserList"] = onlineUserList;
}
return (Hashtable)HttpContext.Current.Application["OnlineUserList"];
}
set
{
HttpContext.Current.Application["OnlineUserList"] = value;
}
}
/// <summary>
/// 添加在线成员
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool OnlineUserList_Add(string key,string value)
{
try
{
if (OnlineUserList.Contains(key))
OnlineUserList[key] = value;
else
OnlineUserList.Add(key, value);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 添加在线成员
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public bool OnlineUserList_Add(string key)
{
string value = DateTime.Now.ToString();
return OnlineUserList_Add(key, value);
}
public bool OnlineUserList_Delete(string key)
{
bool re = false;
if (OnlineUserList.Contains(key))
{
Hashtable userList = OnlineUserList;
userList.Remove(key);
OnlineUserList = userList;
return true;
}
return re;
}
/// <summary>
/// 判断用户是否在线
/// </summary>
/// <param name="adminName"></param>
/// <returns></returns>
public bool UserIsOnline(string adminName)
{
OnlineClearUserOutTimeInOnLineList();
return OnlineUserList.Contains(adminName) ? true : false;
}
4.开辟一个定时器,20秒去执行验证是否在线方法。 设定一个超时时间,如果当前时间减去最后发送的时间大于设定的超时时间,这说明会员已经离线了,然后更新会员的离线状态;
/// <summary>
/// 删除超时在线用户
/// </summary>
public void OnlineClearUserOutTimeInOnLineList()
{
Hashtable list = new Hashtable();
Hashtable temList = new Hashtable();
list = OnlineUserList;
temList = new Hashtable(list);
foreach (DictionaryEntry de in temList)
{
//删除超时
DateTime onlineTime = DataConverter.StrToDateTime( de.Value, DateTime.Now);
TimeSpan timeSpan = DateTime.Now - onlineTime;
//在线时间和当前时间间隔大于超时分钟数就删除(注:用户非法关闭浏览器)
if (timeSpan.TotalMinutes >= (double) OnlineTimeOut)
{
list.Remove(de.Key);
}
}
OnlineUserList = list;
}
反思:做项目要先理清流程的思路,知道事件机制。
知识点:a.定时器开辟一个线程。 b.hashTable的用法 c. 键值对的用法。 d.静态类和静态变量的用法
浙公网安备 33010602011771号