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

1.MVC中使用signalR入门教程

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

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

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

在开始学习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转载随意注明出处

signalr中Group 分组群发消息的简单使用的更多相关文章

  1. 浅析mongodb中group分组

    这篇文章主要介绍了浅析mongodb中group分组的实现方法及示例,非常的简单实用,有需要的小伙伴可以参考下. group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定 ...

  2. mongodb命令行group分组和java代码中group分组

    group分组统计是数据库比较常用的功能,mongodb也不例外.不过相对于普通的增删改查,group操作就略微麻烦一些, 这里对group在shell中的操作.使用java原生代码操作以及集成spr ...

  3. .net微信公众号开发——群发消息

    作者:王先荣    本文将介绍微信公众号开发中用于群发消息的类MassMessage,包括:(1)MassMessage类:(2)群发:(3)删除:(4)预览:(5)查询发送状态:(6)接收推送群发结 ...

  4. SignalR 中丰富多彩的消息推送方式

    在上一篇 SignalR 文章中,演示了如何通过 SignalR 实现了简单的聊天室功能:本着简洁就是美的原则,这一篇我们也来聊聊在 SignalR 中的用户和组的概念,理解这些基础知识有助于更好的开 ...

  5. 微信分组群发图文40152,微信分组群发图文invalid group id hint

    微信分组群发40152,微信分组群发invalid group id hint >>>>>>>>>>>>>>> ...

  6. java微信接口之五—消息分组群发

    一.微信消息分组群发接口简介 1.请求:该请求是使用post提交地址为: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_t ...

  7. MongoDB学习笔记~管道中的分组实现group+distinct

    回到目录 mongoDB的管道是个好东西,它可以将很多操作批处理实现,即将多个命令放入一个管道,然后去顺序的执行它们,今天我要说的是,利用管道中的分组来实现实现中的ditinct+group的效果,即 ...

  8. C# 中正则表达式 Group 分组【转】

    http://www.cnblogs.com/kiant71/archive/2010/08/14/1799799.html 在一个正则表达式中,如果要提取出多个不同的部分(子表达式项),需要用到分组 ...

  9. C# 中正则表达式 Group 分组

    在一个正则表达式中,如果要提取出多个不同的部分(子表达式项),需要用到分组功能. 在 C# 正则表达式中,Regex 成员关系如下,其中 Group 是其分组处理类. Regex –> Matc ...

随机推荐

  1. 开源纯C#工控网关+组态软件(六)图元组件

    一.   图元概述 图元是构成人机界面的基本单元.如一个个的电机.设备.数据显示.仪表盘,都是图元.构建人机界面的过程就是铺排.挪移.定位图元的过程. 图元设计是绘图和编码的结合.因为图元不仅有显示和 ...

  2. Json解析封装GsonUtil

    感觉Json解析都快谈不上一门技术了,在Android Studio上可以直接使用JsonFormat插件,一键就解析出Json所转换的Javabean,再配合GsonUtil的使用,Json解析的步 ...

  3. e2e测试之Nightmare

    一.e2e测试简介 e2e或者端到端(end-to-end)或者UI测试是一种测试方法,它用来测试一个应用从头到尾的流程是否和设计时候所想的一样.简而言之,它从一个用户的角度出发,认为整个系统都是一个 ...

  4. Less的@import指令

    Less的@import指令 Less中,可以通过 @import指令来导入外部文件.@import指令可以放在代码中的任何位置,导入文件时的处理方式取决于文件的扩展名: 如果扩展名是 .css,文件 ...

  5. dedecms注入漏洞

    版本:Powered by DedeCMSV57_GBK © 2004-2011 DesDev Inc. 漏洞利用EXP:plus/recommend.php?action=&aid=1&am ...

  6. PL/SQL简单实现数据库的连接

    通常我们都会去选择 通过修改配置文件去实现数据库链接,方法如下:找到你orale 安装下的文件:instantclient_11_2\network\admin 修改的主要有三个地方:上面的命名随便起 ...

  7. Dynamics CRM可以设置会话超时和非活动超时吗?

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复266或者20171213可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  8. 给dalao们递dalao们的博客

    hqh使用0 1敲完AC代码 FNXF FNXF tfx .io结尾的都是dalao! ssttkkl 复读:.io结尾的都是dalao! ThetaS Pirote YanQuijote 昵称不能为 ...

  9. PHP之外观模式

    外观(Facade)模式 当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码.如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许 ...

  10. 【Win 10 应用开发】MIDI 音乐合成——乐理篇

    针对 MIDI 音乐的 API ,其实在 Win 8.1 的时候就出现.在UWP中采用了新的驱动模式,MIDI 消息传递更加高效. 首先得说明的是,UWP 的 MIDI 相关 API 不是针对 MID ...