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