asp.net signalR的组播和广播
2016-04-25 23:13
706 查看
什么是signalR,看这里:signalR简介 本文档示例免费下载 官方示例查看
组播和广播区别:简单的讲就是组播是对一组对象播,广播就是对所有对象播
该技术使用场景:在线聊天,站内信消息推送,无刷新实时动态 ,等等各种问题
下面我写了一个组播和广播的小例子
抛开他们底层技术如何实现的不说,就我个人感觉,signalr的十分牛的地方也在于,客户端可以调用服务器类中的函数(比如下面例子的Chathu类的方法),服务器类可以调用客户端定义的js函数(比如, 注册一个函数,chat.client.clientAddBroadcastMessage = function (message){ ---- },服务端就可以调用了)
先说一下我的分组思想:我用一个session对象作为“组id”,这样就做到了同一个浏览器下,该网站的所有页面都有拿到同一个小组的组ID的条件了,进而可以主动加入“组”。
第一步:建一个普通的asp.net mvc项目 4.5版本的
第二步:安装包
第三步:建一个控制器,两个action(为了方便测试,他们逻辑一模一样,页面也仅仅是名字不一样)
如下代码:
第四步:创建一个服务端处理消息类
第五步:注册一下这个处理类,新建一个名为Startup.cs的类
ok,编译启动项目
测试方法:
打开两个浏览器,在IE浏览器中打开这个两个页面 http://localhost:2466/Home/Index http://localhost:2466/Home/newpage 然后再另一个不同的浏览器中还打开这两个页面。 tips:一共四个页面。
然后就可以点击测试了,随便点点,看下组播域广播的区别
组播和广播区别:简单的讲就是组播是对一组对象播,广播就是对所有对象播
该技术使用场景:在线聊天,站内信消息推送,无刷新实时动态 ,等等各种问题
下面我写了一个组播和广播的小例子
抛开他们底层技术如何实现的不说,就我个人感觉,signalr的十分牛的地方也在于,客户端可以调用服务器类中的函数(比如下面例子的Chathu类的方法),服务器类可以调用客户端定义的js函数(比如, 注册一个函数,chat.client.clientAddBroadcastMessage = function (message){ ---- },服务端就可以调用了)
先说一下我的分组思想:我用一个session对象作为“组id”,这样就做到了同一个浏览器下,该网站的所有页面都有拿到同一个小组的组ID的条件了,进而可以主动加入“组”。
第一步:建一个普通的asp.net mvc项目 4.5版本的
第二步:安装包
install-package Microsoft.AspNet.SignalR
第三步:建一个控制器,两个action(为了方便测试,他们逻辑一模一样,页面也仅仅是名字不一样)
如下代码:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace ALLAndGroup.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { //获取一个组id,没有就生成一个,注意:session在各个页面是互通的 if (Session["groupid"] == null) { Session["groupid"] = Guid.NewGuid().ToString(); } ViewBag.sid = Session["groupid"]; return View(); } public ActionResult NewPage() { //获取一个组id,没有就生成一个,注意:session在各个页面是互通的 if (Session["groupid"] == null) { Session["groupid"] = Guid.NewGuid().ToString(); } ViewBag.sid = Session["groupid"]; return View(); } } }两个一样的页面,引入JS:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <title>SignalR Simple Chat</title> <style type="text/css"> .container { background-color: #99CCFF; border: thick solid #808080; padding: 20px; margin: 20px; } </style> <script src="~/Scripts/jquery-1.8.2.js"></script> <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script> <script src="/signalr/hubs"></script> <script type="text/javascript"> $(function () { var chat = $.connection.chatHub; //定义一个广播函数,用来被服务端调用 chat.client.clientAddBroadcastMessage = function (message) { var encodedName = $('<div />').text("广播").html(); var encodedMsg = $('<div />').text(message).html(); $('#discussion').append('<li><strong>' + encodedName + '</strong>: ' + encodedMsg + '</li>'); }; $('#message').focus(); //定义一个组播函数,用来被服务端调用 chat.client.clientAddGroupMessage = function (groupid, message) { var encodedName = $('<div />').text(groupid).html(); var encodedMsg = $('<div />').text(message).html(); $('#discussion').append('<li><strong>' + encodedName + '</strong>: ' + encodedMsg + '</li>'); }; //页面加载就启动 $.connection.hub.start().done(function () { //把当前绘画添加到一个组内,调用服务端添加组函数 chat.server.serverAddGroup('@ViewBag.sid'); //点击发送按钮组播,调用服务端函数发送组播信息 $('#sendGroupmessage').click(function () { chat.server.serverGroupSend('@ViewBag.sid', $('#message').val()); $('#message').val('').focus(); }); //点击发送按钮广播,调用服务端函数发送广播信息 $('#sendBroadmessage').click(function () { chat.server.serverBroadcastMessage($('#message').val()); $('#message').val('').focus(); }); }); }); </script> </head> <body> <div class="container"> <h1>页面乙</h1> <p style="font-size:12px;">组ID:@ViewBag.sid</p> <p style="font-size:12px;">注意:本程序默认把同一个会话的所有页面添加到一个小组 <a href="/home/index" target="_blank">在开一个页面</a></p> <input type="text" id="message" /> <input type="button" id="sendGroupmessage" value="组播" /> <input type="button" id="sendBroadmessage" value="广播" /> <input type="hidden" id="displayname" /> <ul id="discussion"></ul> </div> </body> </html>
第四步:创建一个服务端处理消息类
using Microsoft.AspNet.SignalR; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ALLAndGroup { public class ChatHub : Hub { /// <summary> /// 定义一个广播函数,用来被客户端调用 /// </summary> /// <param name="message"></param> public void ServerBroadcastMessage(string message) { Clients.All.clientAddBroadcastMessage(message); } /// <summary> /// 定义一个添加分组函数,用来被客户端调用 /// </summary> /// <param name="GroupId"></param> public void ServerAddGroup(String GroupId) { Groups.Add(Context.ConnectionId, GroupId); } /// <summary> /// 定义一个组播函数,用来被客户端调用 /// </summary> /// <param name="GroupId"></param> /// <param name="Message"></param> public void ServerGroupSend(String GroupId, String Message) { Clients.Group(GroupId).clientAddGroupMessage(GroupId, Message); } } }
第五步:注册一下这个处理类,新建一个名为Startup.cs的类
using Owin; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace ALLAndGroup { public class Startup { public void Configuration(IAppBuilder app) { // Any connection or hub wire up and configuration should go here app.MapSignalR(); } } }
ok,编译启动项目
测试方法:
打开两个浏览器,在IE浏览器中打开这个两个页面 http://localhost:2466/Home/Index http://localhost:2466/Home/newpage 然后再另一个不同的浏览器中还打开这两个页面。 tips:一共四个页面。
然后就可以点击测试了,随便点点,看下组播域广播的区别
相关文章推荐
- ASP.NET中IsPostBack详解
- 使用ASP.NET OleDb驱动程序 导入到处EXCEL
- 【ASP.NET】Aspnetpager对GridView分页,并导出Excel
- 基于@Aspectj使用Spring aop @Around进行权限拦截
- 【Asp.Net】日期控件DatePicker使用
- ASP.NET MVC使用Bundle来打包压缩js和css
- Raspi下GitoLite 环境搭建
- asp.net mvc中加入log4net记录错误日志
- ASP.NET MVC HtmlHelper如何扩展
- ASP.NET中如何防范SQL注入式攻击
- ASP.NET MVC4学习之-------保持数据到数据库EF
- 【Raspberry Pi 3试用体验】+ 微博机器人
- 【Raspberry Pi 3试用体验】+ 搭建本地DNS服务器
- ASP.NET中 Wizard 控件的使用方法
- ASP.NET mvc 在视图中使用@helper封装输出代码
- ASP.NET中 TextBox 文本输入框控件的使用方法
- ASP.NET Table 表格控件的使用方法
- 写自己的ASP.NET MVC框架(下)
- 写自己的ASP.NET MVC框架(上)
- asp.net 5.0微信支付