日期:2014-05-17  浏览次数:20575 次

实现一个账号只能在一个客户端登录,像QQ登录一样的效果
实现一个账号只能在一个客户端登录,像QQ登录一样的效果!当一个账号已经在一个客户端登录后,然后在第二个客户端再用同一个账号登录时,第一个客户端掉线

例如:
  admin 在A客户端登录。
  B客户端也用admin登录。
  这时候,A客户端出现admin账号在别的地方登录的提示,并掉线


不要思路。给个简单的实现代码

------解决方案--------------------
MARK ~
------解决方案--------------------
这种事情,别人只能给思路,而不是代码。

服务器端记录当前登录状态,如果用户已登录,则向第一个登录发送消息,迫使它下线。
------解决方案--------------------
登录的时候
hash["a"] = a_ip;


在httpmodule里对每个请求检查:hash["a"]=当前IP,正常,否则,就提示下线,并执行下线操作。
------解决方案--------------------
scoket维护用户列表

上线,下线,是否登陆维护.
------解决方案--------------------
C# code


if (UserIsOnline(adminName))
            {
               ...........               
            }




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

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