From 9dc290fb5a22b9e070e0b5be62f8a6b47423bb71 Mon Sep 17 00:00:00 2001 From: liujiaqiang <1448951783@qq.com> Date: Wed, 14 Jun 2023 15:54:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0WebSocket=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Common/WebSocketController.cs | 236 +++++++++++++++--- .../system/SystemControllerController.cs | 52 ++-- Elight.Logic/CurrencyDelete.cs | 4 +- 3 files changed, 234 insertions(+), 58 deletions(-) diff --git a/24Hour/Controllers/Common/WebSocketController.cs b/24Hour/Controllers/Common/WebSocketController.cs index 2cfd9a7..e7662b9 100644 --- a/24Hour/Controllers/Common/WebSocketController.cs +++ b/24Hour/Controllers/Common/WebSocketController.cs @@ -3,23 +3,27 @@ using Elight.Logic; using Elight.Utility; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; using SqlSugar; using System.Net.WebSockets; +using System.Text; namespace _24Hour.Controllers.Common { - //[Authorize] + [Authorize] public class WebSocketController : Controller { - //private readonly SqlSugarClient _db;//数据库 - //App_Sys_UserModel _userdata = new App_Sys_UserModel();//当前用户 - //private readonly ILogger _logger;//日志 - //public WebSocketController(ILogger logger, SqlSugarClient db, User user) - //{ - // _logger = logger; - // _db = db; - // _userdata = user.Userdata(); - //} + private readonly SqlSugarClient _db;//数据库 + App_Sys_UserModel _userdata = new App_Sys_UserModel();//当前用户 + private readonly ILogger _logger;//日志 + private static Dictionary CONNECT_POOL = new Dictionary();//用户连接池 + //private static Dictionary> MESSAGE_POOL = new Dictionary>();//离线消息池 + public WebSocketController(ILogger logger, SqlSugarClient db, User user) + { + _logger = logger; + _db = db; + _userdata = user.Userdata(); + } [HttpGet("/ws")] public async Task WebSocketServer() { @@ -28,32 +32,202 @@ namespace _24Hour.Controllers.Common try { var socket = await HttpContext.WebSockets.AcceptWebSocketAsync(); - //ProcessChat(socket); + ProcessChat(socket); } catch (Exception ex) { } } } - //private async Task ProcessChat(WebSockets context) - //{ - // WebSocket socket = context.WebSocket; - // while (true) - // { - // if (socket.State == WebSocketState.Open) - // { - // ArraySegment buffer = new ArraySegment(new byte[2048]); - // WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); - // string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count); - // userMsg = "你发送了:" + userMsg + "于" + DateTime.Now.ToLongTimeString(); - // buffer = new ArraySegment(Encoding.UTF8.GetBytes(userMsg)); - // await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); - // } - // else - // { - // break; - // } - // } - //} + private async Task ProcessChat(WebSocket socket) + { + string user = _userdata.Id; + + try + { + #region 用户添加连接池 + //第一次open时,添加到连接池中 + if (!CONNECT_POOL.ContainsKey(user)) + CONNECT_POOL.Add(user, socket);//不存在,添加 + else + if (socket != CONNECT_POOL[user])//当前对象不一致,更新 + CONNECT_POOL[user] = socket; + #endregion + + string descUser = string.Empty;//目的用户 + while (true) + { + if (socket.State == WebSocketState.Open) + { + } + else + { + break; + } + }//while end + } + catch (Exception ex) + { + //整体异常处理 + if (CONNECT_POOL.ContainsKey(user)) CONNECT_POOL.Remove(user); + } } + + /// + /// 消息发送 + /// + /// + /// + [HttpPost] + [Route("WebSocketSend")] + public async Task WebSocketSend(WebSocketSending Sendingdata) + { + try + { + //获取发送人连接 + var socket = CONNECT_POOL.Where(q => q.Key == _userdata.Id).Select(q => q.Value).First(); + while (true) + { + if (socket.State == WebSocketState.Open) + { + ArraySegment buffer = new ArraySegment(new byte[2048]); + WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); + + #region 消息处理(消息转发) + try + { + #region 关闭Socket处理,删除连接池 + if (socket.State != WebSocketState.Open)//连接关闭 + { + if (CONNECT_POOL.ContainsKey(_userdata.Id)) CONNECT_POOL.Remove(_userdata.Id);//删除连接池 + break; + } + #endregion + + + #region 消息发送 + var content = JsonConvert.SerializeObject(Sendingdata); + buffer = new ArraySegment(Encoding.UTF8.GetBytes(content)); + + if (CONNECT_POOL.ContainsKey(Sendingdata.recipient))//判断客户端是否在线 + { + WebSocket destSocket = CONNECT_POOL[Sendingdata.recipient];//目的客户端 + if (destSocket != null && destSocket.State == WebSocketState.Open) + await destSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); + else + { + //添加未读 + } + } + else + { + //添加未读 + //添加一条未读消息 + //Task.Run(() => + //{ + // if (!MESSAGE_POOL.ContainsKey(descUser))//将用户添加至离线消息池中 + // MESSAGE_POOL.Add(descUser, new List()); + // MESSAGE_POOL[descUser].Add(new MessageInfo(DateTime.Now, buffer));//添加离线消息 + //}); + } + #endregion + } + catch (Exception exs) + { + //消息转发异常处理,本次消息忽略 继续监听接下来的消息 + } + #endregion + } + else + { + } + }//while end + } + catch (Exception) + { + //整体异常处理 + if (CONNECT_POOL.ContainsKey(_userdata.Id)) CONNECT_POOL.Remove(_userdata.Id); + } + } + + + /// + /// 消息发送 + /// + /// + /// + [HttpPost] + [Route("text")] + public async Task text(WebSocketSending Sendingdata) + { + try + { + //获取发送人连接 + var socket = CONNECT_POOL.Where(q => q.Key == _userdata.Id).Select(q => q.Value).First(); + while (true) + { + if (socket.State == WebSocketState.Open) + { + ArraySegment buffer = new ArraySegment(new byte[2048]); + WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); + + #region 消息处理(消息转发) + try + { + #region 关闭Socket处理,删除连接池 + if (socket.State != WebSocketState.Open)//连接关闭 + { + if (CONNECT_POOL.ContainsKey(_userdata.Id)) CONNECT_POOL.Remove(_userdata.Id);//删除连接池 + break; + } + #endregion + + + #region 消息发送 + var content = JsonConvert.SerializeObject(Sendingdata); + buffer = new ArraySegment(Encoding.UTF8.GetBytes(content)); + await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); + #endregion + } + catch (Exception exs) + { + //消息转发异常处理,本次消息忽略 继续监听接下来的消息 + } + #endregion + } + else + { + } + }//while end + } + catch (Exception) + { + //整体异常处理 + if (CONNECT_POOL.ContainsKey(_userdata.Id)) CONNECT_POOL.Remove(_userdata.Id); + } + } + } + + /// + /// 消息发送 + /// + public class WebSocketSending + { + /// + /// 发送人 + /// + public string? sender { get; set; } + /// + /// 发送内容 + /// + public string? content { get; set; } + /// + /// 接收人 + /// + public string? recipient { get; set; } + /// + /// 类型 0:消息,1:视频地址 + /// + public string? type { get; set; } } +} diff --git a/24Hour/Controllers/system/SystemControllerController.cs b/24Hour/Controllers/system/SystemControllerController.cs index e210bed..b2a6f83 100644 --- a/24Hour/Controllers/system/SystemControllerController.cs +++ b/24Hour/Controllers/system/SystemControllerController.cs @@ -43,10 +43,10 @@ namespace _24Hour.Controllers.system public async Task QueryUser0(App_Sys_UserInput UserModel) { var list = await _db.Queryable() - .WhereIF(!UserModel.name.IsNullOrEmpty(), q => q.name.Contains(UserModel.name)) - .WhereIF(!UserModel.phone.IsNullOrEmpty(), q => q.phone.Contains(UserModel.phone)) - .WhereIF(!UserModel.duties.IsNullOrEmpty(), q => q.duties.Contains(UserModel.duties)) - .WhereIF(!UserModel.cardId.IsNullOrEmpty(), q => q.cardId.Contains(UserModel.cardId)) + .WhereIF(!UserModel.name.IsNull(), q => q.name.Contains(UserModel.name)) + .WhereIF(!UserModel.phone.IsNull(), q => q.phone.Contains(UserModel.phone)) + .WhereIF(!UserModel.duties.IsNull(), q => q.duties.Contains(UserModel.duties)) + .WhereIF(!UserModel.cardId.IsNull(), q => q.cardId.Contains(UserModel.cardId)) .Where(q => q.IsDeleted == 0 && q.usertype == 0) .ToPageListAsync(UserModel.PageIndex, UserModel.PageSize); var data = new QueryResult(UserModel, list); @@ -65,10 +65,10 @@ namespace _24Hour.Controllers.system public async Task QueryUser1(App_Sys_UserInput UserModel) { var list = await _db.Queryable() - .WhereIF(!UserModel.name.IsNullOrEmpty(), q => q.name.Contains(UserModel.name)) - .WhereIF(!UserModel.phone.IsNullOrEmpty(), q => q.phone.Contains(UserModel.phone)) - .WhereIF(!UserModel.duties.IsNullOrEmpty(), q => q.duties.Contains(UserModel.duties)) - .WhereIF(!UserModel.cardId.IsNullOrEmpty(), q => q.cardId.Contains(UserModel.cardId)) + .WhereIF(!UserModel.name.IsNull(), q => q.name.Contains(UserModel.name)) + .WhereIF(!UserModel.phone.IsNull(), q => q.phone.Contains(UserModel.phone)) + .WhereIF(!UserModel.duties.IsNull(), q => q.duties.Contains(UserModel.duties)) + .WhereIF(!UserModel.cardId.IsNull(), q => q.cardId.Contains(UserModel.cardId)) .Where(q => q.IsDeleted == 0 && q.usertype == 1).ToPageListAsync(UserModel.PageIndex, UserModel.PageSize); var data = new QueryResult(UserModel, list); result.IsSucceed = true; @@ -239,7 +239,7 @@ namespace _24Hour.Controllers.system { var totalCount = 0; var list = await _db.Queryable() - .WhereIF(!string.IsNullOrEmpty(roledata.name), q => q.name.Contains(roledata.name)) + .WhereIF(roledata.name.NotNull(), q => q.name.Contains(roledata.name)) .Where(q => q.IsDeleted == 0).ToPageListAsync(roledata.PageIndex, roledata.PageSize); var data = new QueryResult(roledata, list); result.IsSucceed = true; @@ -358,7 +358,7 @@ namespace _24Hour.Controllers.system { var totalCount = 0; var list = await _db.Queryable() - .WhereIF(!roledata.roleId.IsNullOrEmpty(), q => q.roleId == roledata.roleId) + .WhereIF(!roledata.roleId.IsNull(), q => q.roleId == roledata.roleId) .Where(q => q.IsDeleted == 0).Select(x => x.menuId).ToListAsync(); //roledata.PageCount = totalCount; //var data = new QueryResult(roledata, list); @@ -452,7 +452,7 @@ namespace _24Hour.Controllers.system var totalCount = 0; //获取角色下得所有用户id var list = await _db.Queryable() - .WhereIF(!string.IsNullOrEmpty(roledata.roleId), q => q.roleId == roledata.roleId) + .WhereIF(roledata.roleId.IsNull(), q => q.roleId == roledata.roleId) .Where(q => q.IsDeleted == 0).Select(x => x.roleuserId).ToListAsync(); //roledata.PageCount = totalCount; //var data = new QueryResult(roledata, list); @@ -544,9 +544,9 @@ namespace _24Hour.Controllers.system public async Task QueryUnitlist(App_Sys_UnitInput Unitdata) { var list = await _db.Queryable() - .WhereIF(!Unitdata.unitCode.IsNullOrEmpty(), q => q.unitCode.Contains(Unitdata.unitCode)) - .WhereIF(!Unitdata.unitname.IsNullOrEmpty(), q => q.unitname.Contains(Unitdata.unitname)) - .WhereIF(!Unitdata.unitjc.IsNullOrEmpty(), q => q.unitjc.Contains(Unitdata.unitjc)) + .WhereIF(!Unitdata.unitCode.IsNull(), q => q.unitCode.Contains(Unitdata.unitCode)) + .WhereIF(!Unitdata.unitname.IsNull(), q => q.unitname.Contains(Unitdata.unitname)) + .WhereIF(!Unitdata.unitjc.IsNull(), q => q.unitjc.Contains(Unitdata.unitjc)) .Where(q => q.IsDelete == 0).ToListAsync(); result.IsSucceed = true; result.result = list; @@ -562,9 +562,9 @@ namespace _24Hour.Controllers.system public async Task QueryUnitTree(App_Sys_UnitInput Unitdata) { var treelist = await _db.Queryable() - .WhereIF(!Unitdata.unitCode.IsNullOrEmpty(), q => q.unitCode.Contains(Unitdata.unitCode)) - .WhereIF(!Unitdata.unitname.IsNullOrEmpty(), q => q.unitname.Contains(Unitdata.unitname)) - .WhereIF(!Unitdata.unitjc.IsNullOrEmpty(), q => q.unitjc.Contains(Unitdata.unitjc)) + .WhereIF(!Unitdata.unitCode.IsNull(), q => q.unitCode.Contains(Unitdata.unitCode)) + .WhereIF(!Unitdata.unitname.IsNull(), q => q.unitname.Contains(Unitdata.unitname)) + .WhereIF(!Unitdata.unitjc.IsNull(), q => q.unitjc.Contains(Unitdata.unitjc)) .WhereIF(Unitdata.StartTime != null && Unitdata.EndTime != null, q => q.createtime >= Unitdata.StartTime && q.createtime < Unitdata.EndTime.Value.AddDays(1)) .Where(q => q.IsDelete == 0).ToTreeAsync(it => it.children, it => it.pid, null); result.IsSucceed = true; @@ -710,7 +710,9 @@ namespace _24Hour.Controllers.system { var totalCount = 0; var list = await _db.Queryable() - .WhereIF(!unitId.IsNullOrEmpty(), q => q.unitId.Contains(unitId)) + .WhereIF(!unitId.IsNull(), q => q.unitId.Contains(unitId)) + .WhereIF(!unitId.IsNull(), q => q.unitId.Contains(unitId)) + .WhereIF(!unitId.IsNull(), q => q.unitId.Contains(unitId)) .Where(q => q.IsDelete == 0).ToListAsync(); result.IsSucceed = true; result.result = list; @@ -726,10 +728,10 @@ namespace _24Hour.Controllers.system public async Task QueryDepart(App_Sys_DepartInput Departdata) { var list = await _db.Queryable() - .WhereIF(!Departdata.departCode.IsNullOrEmpty(), q => q.departCode.Contains(Departdata.departCode)) - .WhereIF(!Departdata.departjc.IsNullOrEmpty(), q => q.departjc.Contains(Departdata.departjc)) - .WhereIF(!Departdata.departname.IsNullOrEmpty(), q => q.departname.Contains(Departdata.departname)) - .WhereIF(!Departdata.unitId.IsNullOrEmpty(), q => q.unitId.Contains(Departdata.unitId)) + .WhereIF(!Departdata.departCode.IsNull(), q => q.departCode.Contains(Departdata.departCode)) + .WhereIF(!Departdata.departjc.IsNull(), q => q.departjc.Contains(Departdata.departjc)) + .WhereIF(!Departdata.departname.IsNull(), q => q.departname.Contains(Departdata.departname)) + .WhereIF(!Departdata.unitId.IsNull(), q => q.unitId.Contains(Departdata.unitId)) .WhereIF(Departdata.StartTime != null && Departdata.EndTime != null, q => q.createtime >= Departdata.StartTime && q.createtime < Departdata.EndTime.Value.AddDays(1)) .Where(q => q.IsDelete == 0).ToPageListAsync(Departdata.PageIndex, Departdata.PageSize); var data = new QueryResult(Departdata, list); @@ -866,7 +868,7 @@ namespace _24Hour.Controllers.system [Route("GetQueryMenusssslist")] public async Task GetQueryMenusssslist() { - var list = await _db.Queryable().Where(q => q.IsDelete == 0 && !string.IsNullOrEmpty(q.pid)).Select(q => new { q.Id, q.name }).ToListAsync(); + var list = await _db.Queryable().Where(q => q.IsDelete == 0 && q.pid.IsNull()).Select(q => new { q.Id, q.name }).ToListAsync(); result.IsSucceed = true; result.result = list; return result; @@ -882,8 +884,8 @@ namespace _24Hour.Controllers.system { var totalCount = 0; var list = await _db.Queryable() - .WhereIF(!Menudata.name.IsNullOrEmpty(), q => q.name.Contains(Menudata.name)) - .WhereIF(!Menudata.pid.IsNullOrEmpty(), q => q.pid.Contains(Menudata.pid)) + .WhereIF(!Menudata.name.IsNull(), q => q.name.Contains(Menudata.name)) + .WhereIF(!Menudata.pid.IsNull(), q => q.pid.Contains(Menudata.pid)) .Where(q => q.IsDelete == 0).ToPageListAsync(Menudata.PageIndex, Menudata.PageSize); var data = new QueryResult(Menudata, list); result.IsSucceed = true; diff --git a/Elight.Logic/CurrencyDelete.cs b/Elight.Logic/CurrencyDelete.cs index f64eaa9..7526e59 100644 --- a/Elight.Logic/CurrencyDelete.cs +++ b/Elight.Logic/CurrencyDelete.cs @@ -18,11 +18,11 @@ namespace Elight.Logic /// Id /// [DataMember] - public string tyId { get; set; } + public string? tyId { get; set; } /// /// 集合Id /// [DataMember] - public List id { get; set; } + public List? id { get; set; } } }