Ejemplo n.º 1
0
        /// <summary>用户客户端上线
        /// </summary>
        protected override void OnOpen()
        {
            //进入锁之前将数据准备好
            string userlogin = Context.QueryString["user"];
            string password  = Context.QueryString["pwd"];

            DBUtil.IDbAccess iDb = Util.iDb_read;

            //准备用户信息
            DataTable dt_user = iDb.GetDataTable(string.Format("select * from CHAT_USER where LOGINNAME={0} and PWD = {1}", iDb.paraPrefix + "uname", iDb.paraPrefix + "upwd"), new IDbDataParameter[] { iDb.CreatePara("uname", userlogin), iDb.CreatePara("upwd", password) });

            if (dt_user.Rows.Count == 0)
            {
                try
                {
                    Context.WebSocket.Send(string.Format("登录失败:用户或密码错误"));
                    try
                    {
                        Close();
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        Console.WriteLine(ex.StackTrace);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
                return;
            }
            //构造客户端对象
            Client client = new Client();

            client.ID        = ID;
            client.StartTime = DateTime.Now;
            client.LOGINNAME = userlogin;
            client.UNAME     = dt_user.Rows[0]["UNAME"].ToString();
            client.USERID    = int.Parse(dt_user.Rows[0]["ID0"].ToString());

            //添加连接对象
            WebSockets.TryAdd(ID, Context.WebSocket);

            //准备群组用户群组对象
            DataTable dt_user_group = iDb.GetDataTable(string.Format("select CHAT_GROUP.* from CHAT_USER_GROUP left join CHAT_GROUP on CHAT_USER_GROUP.GID=CHAT_GROUP.ID0 where USERID='{0}'", client.USERID));

            OnLineData.Edit(online =>
            {
                //用户对象
                User user = null;
                online.Link_Clients.Add(ID, client);

                if (!online.Uid_Users.TryGetValue(client.USERID, out user))
                {
                    //当前用户的第一个客户端进行登录
                    user           = new User();
                    user.Name      = dt_user.Rows[0]["UNAME"].ToString();
                    user.ID0       = int.Parse(dt_user.Rows[0]["ID0"].ToString());
                    user.LoginName = dt_user.Rows[0]["LOGINNAME"].ToString();
                    user.Clients.Add(client.ID, client);
                    online.Uid_Users.Add(user.ID0, user);
                    online.Link_Users.Add(ID, user);

                    //构造群组对象
                    if (dt_user_group.Rows.Count > 0)
                    {
                        int count = dt_user_group.Rows.Count;
                        for (int i = 0; i < count; i++)
                        {
                            int gid = int.Parse(dt_user_group.Rows[i]["ID0"].ToString());
                            Group g;
                            if (!online.Gid_Groups.TryGetValue(gid, out g))
                            {
                                //初次建立群组对象
                                g      = new Group();
                                g.Name = dt_user_group.Rows[i]["GNAME"].ToString();
                                g.ID0  = gid;
                                g.Users.Add(user.ID0, user);
                                online.Gid_Groups.Add(g.ID0, g);
                            }
                            else
                            {
                                //已经存在这个群组对象
                                if (!g.Users.ContainsKey(user.ID0))
                                {
                                    //不包含这个用户
                                    g.Users.Add(user.ID0, user);
                                }
                            }
                        }
                    }
                }
                else
                {
                    //当前用户的多个用户端登录
                    user.Clients.Add(client.ID, client);
                    online.Link_Users.Add(ID, user);
                }
                return(true);
            });
            //广播用户上线通知
            SendBroadCast("/BroadUserOnLine", Newtonsoft.Json.JsonConvert.SerializeObject(new
            {
                type      = "BroadUserOnLine",
                loginname = client.LOGINNAME
            }));
        }
Ejemplo n.º 2
0
        /// <summary>用户客户端下线
        /// </summary>
        protected override void OnClose(CloseEventArgs e)
        {
            //移除连接对象
            WebSocket socket;

            WebSockets.TryRemove(ID, out socket);
            User user = null;
            //是否移除用户
            bool isRemoveUser = false;

            DBUtil.IDbAccess iDb = Util.iDb_read;
            OnLineData.Edit(online =>
            {
                Client client;
                if (online.Link_Clients.TryGetValue(ID, out client))
                {
                    //1.移除客户端
                    online.Link_Clients.Remove(ID);
                }
                if (online.Link_Users.TryGetValue(ID, out user))
                {
                    //2.移除用户
                    online.Link_Users.Remove(ID);
                }
                if (user != null)
                {
                    if (online.Uid_Users.ContainsKey(user.ID0))
                    {
                        User user2 = online.Uid_Users[user.ID0];
                        if (user2.Clients.ContainsKey(ID))
                        {
                            //3.移除用户中的客户端
                            user2.Clients.Remove(ID);
                        }
                        if (user2.Clients.Count == 0)
                        {
                            //4.如果用户没有了客户端就移除这个用户
                            online.Uid_Users.Remove(user.ID0);
                            isRemoveUser = true;
                        }
                    }
                }
                if (isRemoveUser)
                {
                    List <int> _remove_group_keys = new List <int>();
                    foreach (var i in online.Gid_Groups)
                    {
                        if (i.Value.Users.ContainsKey(user.ID0))
                        {
                            //5.从组中移出用户
                            i.Value.Users.Remove(user.ID0);
                        }
                        if (i.Value.Users.Count == 0)
                        {
                            //6.如果组中已没有用户,就将这个组移除,记住ID后面删除
                            _remove_group_keys.Add(i.Key);
                        }
                    }
                    foreach (var i in _remove_group_keys)
                    {
                        online.Gid_Groups.Remove(i);
                    }
                }
                return(true);
            });
            OnLineData onlinedata = OnLineData.GetReleaseModelReadOnly();

            if (user != null && isRemoveUser)
            {
                //广播下线消息(存在这个用户并且这个用户的客户端全部下线后)
                //仅将消息发送给这个用户的好友
                try
                {
                    DataTable dt = iDb.GetDataTable("select * from CHAT_USER_RELATION a left join CHAT_USER b on a.USERID2=b.ID0 where a.USERID1='" + user.ID0 + "'");
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        int userid = int.Parse(dt.Rows[i]["USERID2"].ToString());
                        SendUser("/BroadUserOffLine", userid, Newtonsoft.Json.JsonConvert.SerializeObject(new { uid = user.ID0 }));
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    Console.WriteLine(ex.StackTrace);
                }
            }
        }