/// <summary> /// 手机端登录限制为1 /// </summary> /// <param name="UserPool">用户池</param> /// <param name="UserName">发送到的用户名</param> /// <param name="LimitUser">限制用户名</param> /// <returns></returns> private async Task Limit(Dictionary <string, WebSocket> UserPool, string UserName, string LimitUser) { var userNameList = UserPool.Select(s => s.Key).Where(s => s.Contains(LimitUser)).ToList(); if (userNameList.Count > 1) { foreach (var user in userNameList) { if (user.Split('/')[0] == UserName.Split('/')[0]) { var mes = new MesInfo2 { SendTo = UserName, MobileNo = "", MesTitle = "提示", MesData = $"已有用户登陆,须排队等待", Result = false, }; await SendMes(mes, CONNECT_POOL[UserName]); } } } //if (UserPool.Where(s => s.Key.Contains(LimitUser)).Count() > 1 && UserName.Contains(LimitUser)) //{ //} }
/// <summary> /// 当链接关闭,通知PC端用户下线,删除用户 /// </summary> /// <param name="UserPool"></param> /// <param name="UserName"></param> /// <returns></returns> private async Task SendToPCOut(Dictionary <string, WebSocket> UserPool, string UserName) { try { //手机端下线时,通知PC端 if (CONNECT_POOL.ContainsKey(UserName)) { var sendTo = ""; var userType = ""; if (UserName.Contains("Roll")) { sendTo = "Roll-PC"; userType = "Roll-WC"; } else { sendTo = "Turn-PC"; userType = "Turn-WC"; } //当同一类型在线人数大于1时 不能关闭 返回false var HasOnLine = false; var mes = new MesInfo2(); lock (OnLine_Lock) { HasOnLine = CONNECT_POOL.Where(s => s.Key.Contains(userType)).Count() > 1 ? false : true; mes = new MesInfo2 { SendTo = sendTo, MobileNo = UserName.Split('/')[1], MesTitle = "连接信息", MesData = $"下线-{HasOnLine}", Result = false, }; } await SendMes(mes, CONNECT_POOL[sendTo]); CONNECT_POOL.Remove(UserName);//删除连接池 } } catch (Exception ex) { Log.Error("SendToPCOut", ex); } }
/// <summary> /// 发送消息 /// </summary> /// <param name="mes"></param> /// <param name="ws"></param> /// <returns></returns> public async Task SendMes(MesInfo2 mes, WebSocket ws) { var ts = new ArraySegment <byte>(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(mes))); await ws.SendAsync(ts, WebSocketMessageType.Text, true, CancellationToken.None); }