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

小编 2026-07-03 阅读:815 评论:0
前一段时间写了几篇关于signalr的文章1.MVC中使用signalR入门教程2.mvc中si...

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

1.MVC中使用signalR入门教程

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

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

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

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


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

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


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

当然在实际中如何实现,看下接下来的代码
namespace signalrGroupDemo.Models{    public class DbContext    {        public DbContext()        {            Users = new List<User>();            Connections = new List<Connection>();            Rooms = new List<Room>();        }        //用户集合        public List<User> Users { get; set; }        //连接集合        public List<Connection> Connections { get; set; }        //房间集合        public List<Room> Rooms { get; set; }    }    //用户类    public class User    {       [Key]        public string UserName { get; set; }       //用户连接       public List<Connection> Connections { get; set; }        //用户房间集合        public virtual List<Room> Rooms { get; set; }        public User()        {            Connections = new List<Connection>();            Rooms = new List<Room>();        }    }    public class Connection    {        //连接ID        public string ConnectionID { get; set; }        //用户代理        public string userAgent { get; set; }        //是否连接        public bool Connected { get; set; }    }    //房间类    public class Room    {        [Key]        public string RommName { get; set; }       //用户集合       public virtual List<User> Users { get; set; }        public Room() {            Users = new List<User>();        }    }}

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

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Web;using Microsoft.AspNet.SignalR;using signalrGroupDemo.Models;using Newtonsoft.Json;using Microsoft.AspNet.SignalR.Hubs;namespace signalrGroupDemo{    [HubName("groupHub")]    public class GroupHUb : Hub    {        public void Hello()        {            Clients.All.hello();        }        public static DbContext db = new DbContext();        /// <summary>        /// 重写Hub连接事件        /// </summary>        /// <returns></returns>        public override Task OnConnected()        {            //查询用户            var user = db.Users.Where(w => w.UserName == Context.ConnectionId).FirstOrDefault();            //判断用户是否存在            if (user == null)            {                user = new User()                {                    UserName = Context.ConnectionId                };                db.Users.Add(user);            }            //发送房间列表            var rooms = db.Rooms.Select(p => p.RoomName).ToList();            //注册getRooms 获取房间的方法            Clients.Client(Context.ConnectionId).getRoomList(JsonConvert.SerializeObject(rooms));            return base.OnConnected();        }        //更新所有用户的房间列表        private void GetRooms()        {            var rooms =JsonConvert.SerializeObject(db.Rooms.Select(p => p.RoomName).ToList());            Clients.All.getRoomList(rooms);        }        //重写Hub链接断开事件        public override Task OnDisconnected(bool s)        {            var user = db.Users.Where(u=>u.UserName==Context.ConnectionId).FirstOrDefault();            //判断用户是否存在,存在则删除            if (user != null)            {                //删除用户                db.Users.Remove(user);            }            return base.OnDisconnected(s);        }        //加入聊天室        public void AddRoom(string  roomName)        {            //查询聊天室            var room = db.Rooms.Find(a=>a.RoomName==roomName);            //存在则加入            if (room != null)            {                //查找房间中是否存在此用户                var isUser = room.Users.Where(w => w.UserName == Context.ConnectionId).FirstOrDefault();                //不存在则加入                if (isUser == null)                {                    var user = db.Users.Find(a => a.UserName == Context.ConnectionId);                    user.Rooms.Add(room);                    room.Users.Add(user);                    Groups.Add(Context.ConnectionId, roomName);                    //注册加入聊天室的addRoom方法                    Clients.Client(Context.ConnectionId).addRoom(roomName);                }                else                {                    Clients.Client(Context.ConnectionId).showMessage("请勿重复加入房间");                }            }        }        //创建聊天室        public void CreateRoom(string  roomName)        {            var room = db.Rooms.Find(a=>a.RoomName==roomName);            if (room == null)            {                Room r = new Room() { RoomName = roomName };                //将房间加入列表                db.Rooms.Add(r);                AddRoom(roomName);                Clients.Client(Context.ConnectionId).showMessage("房间创建完成");                GetRooms();            }            else            {                Clients.Client(Context.ConnectionId).showMessage("房间名重复");            }        }        //退出聊天室        public void ExitRoom(string  roomName)        {            //查找房间是否存在            var room = db.Rooms.Find(a=>a.RoomName==roomName);            //存在则删除            if (room != null)            {                //查找要删除的用户                var user = room.Users.Where(p => p.UserName == Context.ConnectionId).FirstOrDefault();                //移除此用户                room.Users.Remove(user);                //如果房间人数为0,怎删除房间                if (room.Users.Count == 0)                {                    db.Rooms.Remove(room);                }                //Groups Remove移除分组方法                Groups.Remove(Context.ConnectionId,roomName);                //提示客户端                Clients.Client(Context.ConnectionId).removeRoom("退出成功");            }        }        //给分组内所有用户发送消息        public void SendMsg(string  Room,string  Message)        {            Clients.Group(Room, new string[0]).sendMessage(Room,Message+" "+DateTime.Now.ToString());        }    }}

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

@{    Layout = null;}<!DOCTYPE html><html><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <meta charset="utf-8" />    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>signalr group 分组方法的使用</title>    <script src="~/Scripts/jquery-1.10.2.min.js"></script>    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>     @*这里是虚拟目录,也就是你再OWIN Startup中注册的地址*@    <script src="~/signalr/hubs"></script></head><body>    <div><div>名称:<p id="userName"></p></div>        房间名:<input  type="text" value="ceshi" id="roomName"/>        <button id="createRoom">创建聊天室</button></div>      <div style="float:left;border:double">        <div>房间列表</div><ul id="roomList"></ul>    </div>    <div id="rooms"></div>    <script>    var  chat;    var roomCount =0;    $(function(){        chat = $.connection.groupHub;        //调用hub中注册的showMessage方法        chat.client.showMessage= function (message)        {            alert(message);        }        //调用hub中注册的sendMessage 方法        chat.client.sendMessage= function (roomname, message)        {            debugger            $("#" + roomname).find("ul").each(function () {                $(this).append('<li>'+message+'</li>');            })        }        //调用hub中removeRoom 退出房间方法        chat.client.removeRoom = function (data)        {            alert(data);        }        //注册查询房间列表的方法        chat.client.getRoomList = function (data) {                        if (data) {                debugger                var jsonData = $.parseJSON(data);                $("#roomList").html(" ");                for (var i = 0; i < jsonData.length; i++) {                    var html = '<li>房间名:' + jsonData[i] + '<button roomName="' + jsonData[i] + '" onclick="addRoom(this)">加入</button> </li>'                    $("#roomList").append(html);                }            }        }        //调用hub中addRoom 加入房间的方法        chat.client.addRoom = function (roomName)        {            var html = '<div style="float:left; margin-left:30px; border:double" id="' + roomName + '" roomname="' + roomName + '" ><button onclick="removeRoom(this)">退出房间</button>                           ' + roomName + '房间聊天记录如下:<ul></ul> <input type="text"/> <button onclick="send(this)">发送</button><div>'            $("#rooms").append(html);        }        //获取用户名称        $("#userName").html(prompt('请输入您的名称:', ''));        $.connection.hub.start().done(function () {            $("#createRoom").click(function ()            {                if (roomCount < 2) {                    chat.server.createRoom($("#roomName").val());                }                else                {                    alert("聊天窗口只允许有2个");                }            })        })    })          //发送消息的方法        function send(btn)        {                        var message = $(btn).prev().val();            var room = $(btn).parent();            var userName = $("#userName").html();            message = userName + ":" + message;            var roomName = $(room).attr("roomName");            chat.server.sendMsg(roomName,message);        }        //退出房间        function removeRoom(btn)        {            var room = $(btn).parent();            var roomName = $(room).attr("roomName");            chat.server.exitRoom(roomName);        }        //加入房间        function addRoom(roomName)        {            var data = $(roomName).attr("roomName");            chat.server.addRoom(data);        }        </script></body></html>

代码下载地址:作者:张林标题:signalr中Group 分组群发消息的简单使用 原文地址:http://blog.csdn.net/kebi007/article/details/54866672转载随意注明出处                                                               															
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表