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.静态类和静态变量的用法

posted on 2014-03-25 22:35  闪电光芒  阅读(356)  评论(0)    收藏  举报

导航