MessageHub.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using Infrastructure;
  2. using Infrastructure.Constant;
  3. using Infrastructure.Model;
  4. using IPTools.Core;
  5. using Microsoft.AspNetCore.SignalR;
  6. using ZR.Admin.WebApi.Extensions;
  7. using ZR.Admin.WebApi.Framework;
  8. using ZR.Model;
  9. using ZR.Model.System;
  10. using ZR.Service.System.IService;
  11. namespace ZR.Admin.WebApi.Hubs
  12. {
  13. public class MessageHub : Hub
  14. {
  15. //创建用户集合,用于存储所有链接的用户数据
  16. private static readonly List<OnlineUsers> clientUsers = new();
  17. private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
  18. private readonly ISysNoticeService SysNoticeService;
  19. public MessageHub(ISysNoticeService noticeService)
  20. {
  21. SysNoticeService = noticeService;
  22. }
  23. private ApiResult SendNotice()
  24. {
  25. var result = SysNoticeService.GetSysNotices();
  26. return new ApiResult(200, "success", result);
  27. }
  28. #region 客户端连接
  29. /// <summary>
  30. /// 客户端连接的时候调用
  31. /// </summary>
  32. /// <returns></returns>
  33. public override Task OnConnectedAsync()
  34. {
  35. var name = HttpContextExtension.GetName(App.HttpContext);// Context.User.Identity.Name;
  36. var ip = HttpContextExtension.GetClientUserIp(App.HttpContext);
  37. var ip_info = IpTool.Search(ip);
  38. LoginUser loginUser = JwtUtil.GetLoginUser(App.HttpContext);
  39. var user = clientUsers.Any(u => u.ConnnectionId == Context.ConnectionId);
  40. //判断用户是否存在,否则添加集合
  41. if (!user && Context.User.Identity.IsAuthenticated)
  42. {
  43. OnlineUsers users = new(Context.ConnectionId, name, loginUser?.UserId, ip)
  44. {
  45. Location = ip_info.City
  46. };
  47. clientUsers.Add(users);
  48. Console.WriteLine($"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{clientUsers.Count}个");
  49. //Clients.All.SendAsync("welcome", $"欢迎您:{name},当前时间:{DateTime.Now}");
  50. Clients.All.SendAsync(HubsConstant.MoreNotice, SendNotice());
  51. }
  52. Clients.All.SendAsync(HubsConstant.OnlineNum, clientUsers.Count);
  53. Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers);
  54. return base.OnConnectedAsync();
  55. }
  56. /// <summary>
  57. /// 连接终止时调用。
  58. /// </summary>
  59. /// <returns></returns>
  60. public override Task OnDisconnectedAsync(Exception? exception)
  61. {
  62. var user = clientUsers.Where(p => p.ConnnectionId == Context.ConnectionId).FirstOrDefault();
  63. //判断用户是否存在,否则添加集合
  64. if (user != null)
  65. {
  66. clientUsers.Remove(user);
  67. Clients.All.SendAsync(HubsConstant.OnlineNum, clientUsers.Count);
  68. Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers);
  69. Console.WriteLine($"用户{user?.Name}离开了,当前已连接{clientUsers.Count}个");
  70. }
  71. return base.OnDisconnectedAsync(exception);
  72. }
  73. #endregion
  74. /// <summary>
  75. /// 注册信息
  76. /// </summary>
  77. /// <param name="connectId"></param>
  78. /// <param name="userName"></param>
  79. /// <param name="message"></param>
  80. /// <returns></returns>
  81. [HubMethodName("SendMessage")]
  82. public async Task SendMessage(string connectId, string userName, string message)
  83. {
  84. Console.WriteLine($"{connectId},message={message}");
  85. await Clients.Client(connectId).SendAsync("receiveChat", new { userName, message });
  86. }
  87. }
  88. }