您的位置:首页 > 编程语言 > ASP

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版本的

第二步:安装包

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:一共四个页面。

然后就可以点击测试了,随便点点,看下组播域广播的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: