隐藏

signalr中Group 分组群发消息的简单使用

发布:2020/11/16 11:03:35作者:管理员 来源:本站 浏览次数:1929

前一段时间写了几篇关于signalr的文章

1.MVC中使用signalR入门教程

2.mvc中signalr实现一对一的聊天

3.Xamarin android中使用signalr实现即时通讯

在平时的工作中用到了signalr进行消息的推送,所以总结了这几篇文章,今天我就来写一写这个signalr如何使用Group 分组方法群发消息。更全面地了解和学习使用signalr。

在开始学习Signalr Group群发消息之前我们来看一下所实现的效果图:

 

强大的signalr已经封装好了Group方法,已经在Hub里面集成了Groups分组管理,关键的使用方法如下:

 

 


  1. //加入Group组方法
  2. //Context.ConnectionId 连接ID,每个页面连接集线器即会产生唯一ID
  3. //roomName分组的名称
  4. Groups.Add(Context.ConnectionId, roomName);
  5. //移除Group组
  6. Groups.Remove(Context.ConnectionId, roomName);
  7. //作用:调用分组内连接对象,注册客户端Js方法
  8. //Room:分组名称
  9. //new string[0]:过滤(不发送)的连接ID数组
// msg:消息内容
 Clients.Group(Room, new string[0]).sendMsg(Room,msg)
 
在客户端中调用: 
chat.client.sendMsg=function(Room,msg){}
 

 

当然在实际中如何实现,看下接下来的代码


  1. namespace signalrGroupDemo.Models
  2. {
  3. public class DbContext
  4. {
  5. public DbContext()
  6. {
  7. Users = new List<User>();
  8. Connections = new List<Connection>();
  9. Rooms = new List<Room>();
  10. }
  11. //用户集合
  12. public List<User> Users { get; set; }
  13. //连接集合
  14. public List<Connection> Connections { get; set; }
  15. //房间集合
  16. public List<Room> Rooms { get; set; }
  17. }
  18. //用户类
  19. public class User
  20. {
  21. [Key]
  22. public string UserName { get; set; }
  23. //用户连接
  24. public List<Connection> Connections { get; set; }
  25. //用户房间集合
  26. public virtual List<Room> Rooms { get; set; }
  27. public User()
  28. {
  29. Connections = new List<Connection>();
  30. Rooms = new List<Room>();
  31. }
  32. }
  33. public class Connection
  34. {
  35. //连接ID
  36. public string ConnectionID { get; set; }
  37. //用户代理
  38. public string userAgent { get; set; }
  39. //是否连接
  40. public bool Connected { get; set; }
  41. }
  42. //房间类
  43. public class Room
  44. {
  45. [Key]
  46. public string RommName { get; set; }
  47. //用户集合
  48. public virtual List<User> Users { get; set; }
  49. public Room() {
  50. Users = new List<User>();
  51. }
  52. }
  53. }
 

第二步:引入Signalr类库,添加Hub集线器类


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using System.Web;
  6. using Microsoft.AspNet.SignalR;
  7. using signalrGroupDemo.Models;
  8. using Newtonsoft.Json;
  9. using Microsoft.AspNet.SignalR.Hubs;
  10. namespace signalrGroupDemo
  11. {
  12. [HubName("groupHub")]
  13. public class GroupHUb : Hub
  14. {
  15. public void Hello()
  16. {
  17. Clients.All.hello();
  18. }
  19. public static DbContext db = new DbContext();
  20. /// <summary>
  21. /// 重写Hub连接事件
  22. /// </summary>
  23. /// <returns></returns>
  24. public override Task OnConnected()
  25. {
  26. //查询用户
  27. var user = db.Users.Where(w => w.UserName == Context.ConnectionId).FirstOrDefault();
  28. //判断用户是否存在
  29. if (user == null)
  30. {
  31. user = new User()
  32. {
  33. UserName = Context.ConnectionId
  34. };
  35. db.Users.Add(user);
  36. }
  37. //发送房间列表
  38. var rooms = db.Rooms.Select(p => p.RoomName).ToList();
  39. //注册getRooms 获取房间的方法
  40. Clients.Client(Context.ConnectionId).getRoomList(JsonConvert.SerializeObject(rooms));
  41. return base.OnConnected();
  42. }
  43. //更新所有用户的房间列表
  44. private void GetRooms()
  45. {
  46. var rooms =JsonConvert.SerializeObject(db.Rooms.Select(p => p.RoomName).ToList());
  47. Clients.All.getRoomList(rooms);
  48. }
  49. //重写Hub链接断开事件
  50. public override Task OnDisconnected(bool s)
  51. {
  52. var user = db.Users.Where(u=>u.UserName==Context.ConnectionId).FirstOrDefault();
  53. //判断用户是否存在,存在则删除
  54. if (user != null)
  55. {
  56. //删除用户
  57. db.Users.Remove(user);
  58. }
  59. return base.OnDisconnected(s);
  60. }
  61. //加入聊天室
  62. public void AddRoom(string roomName)
  63. {
  64. //查询聊天室
  65. var room = db.Rooms.Find(a=>a.RoomName==roomName);
  66. //存在则加入
  67. if (room != null)
  68. {
  69. //查找房间中是否存在此用户
  70. var isUser = room.Users.Where(w => w.UserName == Context.ConnectionId).FirstOrDefault();
  71. //不存在则加入
  72. if (isUser == null)
  73. {
  74. var user = db.Users.Find(a => a.UserName == Context.ConnectionId);
  75. user.Rooms.Add(room);
  76. room.Users.Add(user);
  77. Groups.Add(Context.ConnectionId, roomName);
  78. //注册加入聊天室的addRoom方法
  79. Clients.Client(Context.ConnectionId).addRoom(roomName);
  80. }
  81. else
  82. {
  83. Clients.Client(Context.ConnectionId).showMessage("请勿重复加入房间");
  84. }
  85. }
  86. }
  87. //创建聊天室
  88. public void CreateRoom(string roomName)
  89. {
  90. var room = db.Rooms.Find(a=>a.RoomName==roomName);
  91. if (room == null)
  92. {
  93. Room r = new Room() { RoomName = roomName };
  94. //将房间加入列表
  95. db.Rooms.Add(r);
  96. AddRoom(roomName);
  97. Clients.Client(Context.ConnectionId).showMessage("房间创建完成");
  98. GetRooms();
  99. }
  100. else
  101. {
  102. Clients.Client(Context.ConnectionId).showMessage("房间名重复");
  103. }
  104. }
  105. //退出聊天室
  106. public void ExitRoom(string roomName)
  107. {
  108. //查找房间是否存在
  109. var room = db.Rooms.Find(a=>a.RoomName==roomName);
  110. //存在则删除
  111. if (room != null)
  112. {
  113. //查找要删除的用户
  114. var user = room.Users.Where(p => p.UserName == Context.ConnectionId).FirstOrDefault();
  115. //移除此用户
  116. room.Users.Remove(user);
  117. //如果房间人数为0,怎删除房间
  118. if (room.Users.Count == 0)
  119. {
  120. db.Rooms.Remove(room);
  121. }
  122. //Groups Remove移除分组方法
  123. Groups.Remove(Context.ConnectionId,roomName);
  124. //提示客户端
  125. Clients.Client(Context.ConnectionId).removeRoom("退出成功");
  126. }
  127. }
  128. //给分组内所有用户发送消息
  129. public void SendMsg(string Room,string Message)
  130. {
  131. Clients.Group(Room, new string[0]).sendMessage(Room,Message+" "+DateTime.Now.ToString());
  132. }
  133. }
  134. }

 

第三步:前端调用注册的Server方法和注册Client方法


  1. @{
  2. Layout = null;
  3. }
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <meta charset="utf-8" />
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <title>signalr group 分组方法的使用</title>
  11. <script src="~/Scripts/jquery-1.10.2.min.js"></script>
  12. <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
  13. @*这里是虚拟目录,也就是你再OWIN Startup中注册的地址*@
  14. <script src="~/signalr/hubs"></script>
  15. </head>
  16. <body>
  17. <div><div>名称:<p id="userName"></p></div>
  18. 房间名:<input type="text" value="ceshi" id="roomName"/>
  19. <button id="createRoom">创建聊天室</button></div>
  20. <div style="float:left;border:double">
  21. <div>房间列表</div><ul id="roomList"></ul>
  22. </div>
  23. <div id="rooms"></div>
  24. <script>
  25. var chat;
  26. var roomCount =0;
  27. $(function(){
  28. chat = $.connection.groupHub;
  29. //调用hub中注册的showMessage方法
  30. chat.client.showMessage= function (message)
  31. {
  32. alert(message);
  33. }
  34. //调用hub中注册的sendMessage 方法
  35. chat.client.sendMessage= function (roomname, message)
  36. {
  37. debugger
  38. $("#" + roomname).find("ul").each(function () {
  39. $(this).append('<li>'+message+'</li>');
  40. })
  41. }
  42. //调用hub中removeRoom 退出房间方法
  43. chat.client.removeRoom = function (data)
  44. {
  45. alert(data);
  46. }
  47. //注册查询房间列表的方法
  48. chat.client.getRoomList = function (data) {
  49. if (data) {
  50. debugger
  51. var jsonData = $.parseJSON(data);
  52. $("#roomList").html(" ");
  53. for (var i = 0; i < jsonData.length; i++) {
  54. var html = '<li>房间名:' + jsonData[i] + '<button roomName="' + jsonData[i] + '" onclick="addRoom(this)">加入</button> </li>'
  55. $("#roomList").append(html);
  56. }
  57. }
  58. }
  59. //调用hub中addRoom 加入房间的方法
  60. chat.client.addRoom = function (roomName)
  61. {
  62. var html = '<div style="float:left; margin-left:30px; border:double" id="' + roomName + '" roomname="' + roomName + '" ><button onclick="removeRoom(this)">退出房间</button> \
  63. ' + roomName + '房间聊天记录如下:<ul></ul> <input type="text"/> <button onclick="send(this)">发送</button><div>'
  64. $("#rooms").append(html);
  65. }
  66. //获取用户名称
  67. $("#userName").html(prompt('请输入您的名称:', ''));
  68. $.connection.hub.start().done(function () {
  69. $("#createRoom").click(function ()
  70. {
  71. if (roomCount < 2) {
  72. chat.server.createRoom($("#roomName").val());
  73. }
  74. else
  75. {
  76. alert("聊天窗口只允许有2个");
  77. }
  78. })
  79. })
  80. })
  81. //发送消息的方法
  82. function send(btn)
  83. {
  84. var message = $(btn).prev().val();
  85. var room = $(btn).parent();
  86. var userName = $("#userName").html();
  87. message = userName + ":" + message;
  88. var roomName = $(room).attr("roomName");
  89. chat.server.sendMsg(roomName,message);
  90. }
  91. //退出房间
  92. function removeRoom(btn)
  93. {
  94. var room = $(btn).parent();
  95. var roomName = $(room).attr("roomName");
  96. chat.server.exitRoom(roomName);
  97. }
  98. //加入房间
  99. function addRoom(roomName)
  100. {
  101. var data = $(roomName).attr("roomName");
  102. chat.server.addRoom(data);
  103. }
  104. </script>
  105. </body>
  106. </html>