asp.net signalR的组播和广播

    CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记

什么是signalR,看这里:signalR简介  本文档示例免费下载  官方示例查看

(注意:csdn上传的例子视图有个小错误,需要在/home/index和/home/newpage两个视图最顶部都加上@{Layout=null;}

csdn的资源文件上传后删不掉,改不了...


组播和广播区别:简单的讲就是组播是对一组对象播,广播就是对所有对象播


该技术使用场景:在线聊天,站内信消息推送,无刷新实时动态 ,等等各种问题


下面我写了一个组播和广播的小例子

抛开他们底层技术如何实现的不说,就我个人感觉,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:一共四个页面。

然后就可以点击测试了,随便点点,看下组播域广播的区别



















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值