一、前言

ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信。什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端可以互相通知消息及调用方法,当然这是实时操作的。
WebSockets是HTML5提供的新的API,可以在Web网页与服务器端间建立Socket连接,当WebSockets可用时(即浏览器支持Html5)SignalR使用WebSockets,当不支持时SignalR将使用其它技术来保证达到相同效果。
SignalR当然也提供了非常简单易用的高阶API,使服务器端可以单个或批量调用客户端上的JavaScript函数,并且非常 方便地进行连接管理,例如客户端连接到服务器端,或断开连接,客户端分组,以及客户端授权,使用SignalR都非常 容易实现。
SignalR 将与客户端进行实时通信带给了ASP .NET 。当然这样既好用,而且也有足够的扩展性。以前用户需要刷新页面或使用Ajax轮询才能实现的实时显示数据,现在只要使用SignalR,就可以简单实现了。
最重要的是您无需重新建立项目,使用现有ASP .NET项目即可无缝使用SignalR。
 
这博文主要为了提高大家的实战应用,有关原理方面了解可以参考:
http://blog.darkthread.net/post-2013-12-03-inside-signalr-transport.aspx

http://blog.jobbole.com/82746/

二、干货实战开始

在vs2013开发环境

1.创建ASP.NET空Web应用程序项目

2.右击SignalRTest项目添加新项,选择SignalR集线器(v2),并命名集线器名字为TestHub.cs

然后项目自动生成了Scripts文件夹和文件,下面的jquery-1.10.2.js和jquery.signalR-2.0.0.js比较重要的两个js库

3.还要添加一个OWIN Startup类

4.修改TestStartup里面代码,注册管道虚拟地址,为的是前端添加一个引用需要用到的配置地址,现在透露一些信息吧。就是这个<script src="signalr/hubs"></script>。这个文件是运行动态生成的,我们新建项目是看不到的,按照配置好路径就对了!

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(SignalRTest.TestStartup))]

namespace SignalRTest
{
    public class TestStartup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888

            //添加如下代码
            //注册管道,使用默认的虚拟地址,根目录下的"/signalr",当然你也可以自己定义
            app.MapSignalR();
        }
    }
}

5.在刚才新建的集线器里面就可以自己去写方法了,在方法体里可以通过 Clients.All.XXXXX  调用前端注册的js方法,实现了服务端调用客户端。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignalRTest
{
    //Hub的别名,方便前台调用
    [HubName("testHHH")]
    public class TestHub : Hub
    {
        /// <summary>
        /// 自动生成的方法
        /// </summary>
        public void Hello()
        {
            Clients.All.hello();//意思是调用所有客户端的集线器注册的方法
        }

        /// <summary>
        /// 自定义一个方法发送给所有的客户端
        /// </summary>
        /// <param name="msg"></param>
        public void SendToAllClients(string msg)
        {
            Clients.All.allMessage(msg);//意思是调用所有客户端的集线器注册的方法allMessage
        }
    }
}

6.新建一个ChatTest.html 页面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script src="Scripts/jquery-1.10.2.js"></script>
    <script src="Scripts/jquery.signalR-2.0.0.js"></script>
    <!--这里要注意,这是虚拟目录,也就是你在OWIN Startup中注册的地址-->
    <script src="signalr/hubs"></script>
</head>
<body>
    <div>
        <div>姓名:<input type="text" name="name" id="name" /></div>
        <div>
            <ul id="ul">
                <li>开始群聊咯。。。。。。。。。。。。。</li>
            </ul>
            <input type="text" name="content" id="content" /><input type="button" name="btn" id="btn" value="发送" />
        </div>
    </div>
    <script type="text/javascript">
        $(function () {
            //1.声明一个代理引用集线器,如果集线器没有取别名,则要小写$.connection.testHub;如果有别名则直接写别名就好了
            var chatClient = $.connection.testHHH;
            //2.注册服务端调用客户端的方法,就是刚才在TestHub中调用的方法 Clients.All.allMessage(msg);
            //注意是否有参数
            chatClient.client.allMessage = function (msg) {
                //动态加载内容到ul中
                $("#ul").append($("<li>" + msg + "</li>"));
            }

            //3. 必须启动连接
            $.connection.hub.start().done(function () {

                $("#btn").click(function () {
                    if ($("#name").val().length > 0) {
                        var msg = $("#name").val() + "说:" + $("#content").val();
                        //4.客户端调用服务端方法,必须注意,很多时候自己掉坑了。。。调用服务端方法必须小写方法字母开头
                        chatClient.server.sendToAllClients(msg);
                    }
                    else {
                        alert("请输入名字");
                    }
                });

            });

        });
    </script>
</body>
</html>

7.运行结果

三、总结

服务端调用客户端js注册方法名字,名字大小写一致

客户端调用服务端方法,对应方法名字,客户端方的方法字母开头需小写

客户端声明一个代理引用集线器,如果集线器没有取别名,则要集线器类名字母开头小写$.connection.testHub;如果有别名则直接写别名就好了

客户端必须启动连接   $.connection.hub.start().done(function(){这里写调用服务端方法才能够起作用})

源代码:http://files.cnblogs.com/files/kesimin/SignalRTest.zip

SignalR2.0开发实例之——群发消息的更多相关文章

  1. SignalR2.0开发实例之——设置时间、后台其他地方使用集线器、使用自己的连接ID

    一.连接的生命周期设置: 如下: // 该值表示连接在超时之前保持打开状态的时间长度. //默认为110秒 GlobalHost.Configuration.ConnectionTimeout = T ...

  2. SignalR2.0开发实例之——私聊

    一.前言 继续上一章的补充,这章介绍使用私聊的功能.主要通过一个方法   Clients.Client(Context.ConnectionId).showMessage(msg); SignalR框 ...

  3. SignalR2.0开发实例之——创建房间聊天

    SignalR作为一个强大的集线器,已经在hub里面集成了Gorups,也就是分组管理,使用方法如下: //作用:将连接ID加入某个组 //Context.ConnectionId 连接ID,每个页面 ...

  4. SignalR2.0开发实例之——负载均衡

    SignalR 2.0作为一个新的而且强大的通信工具,发布博客之后得到了很多人的支持,谢谢...也有人对性能和架设等问题提出了各种质疑..真的很感谢.. 我特意下载了SignalR 2.0的源码硬着头 ...

  5. springboot2.0+websocket集成【群发消息+单对单】(二)

    https://blog.csdn.net/qq_21019419/article/details/82804921 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上 ...

  6. 一篇对OAuth2.0开发实例的介绍

    今天看到了博友对SSO的文章,SSO单点登录的讲解突然想写一篇关于OAuth2.0用户授权的介绍. 应用场景:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微 ...

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

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

  8. 用SignalR 2.0开发客服系统[系列1:实现群发通讯]

    前言 交流群:195866844 先说一下我为什么会写这个博客吧,(首先说一下,我是一个小菜鸟,讲的不好请指导 - -,)  前段时间公司的项目涉及到在B/S上使用即时通讯,(其实就是做一个B/S的客 ...

  9. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)

    接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...

随机推荐

  1. [c#]控制台进度条的示例

    看到[vb.net]控制台进度条的示例 感觉很好玩,翻译成C#版. using System; using System.Collections.Generic; using System.Linq; ...

  2. (原)torch的apply函数

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6221633.html torch中的apply函数通过可以不断遍历model的各个模块.实际上其使用的 ...

  3. MFC 创建选项卡

    1.创建三个选项卡Dialog窗体,ID分别改为porpTest1.porpTest2.porpTest3 2.创建三个选项卡类,类名分别为CPropTest1.CPropTest2.CPropTes ...

  4. android环境搭配 运行android sdk manager时出现错误问题解决

    本来前几天已经搭配好android环境开发(eclipse+android sdk+jdk),也已经运行成功了.但是最近因为出现了一些问题,所以把前面搭配好的环境都卸载了.重新搭配的时候发现在运行 s ...

  5. ECSTORE2.0 下载 (变量标签)

    条目 用途 备注 coupon.mc.use_times 优惠券可用次数 - security.guest.enabled 是否支持非会员购物 - site.version version的最后修改时 ...

  6. chinaunix:腾讯面试题

    腾讯电商面试回来,发现我太菜了,缺乏技术深度. 笔试题感觉不难,但是做了之后总是发觉少点什么东西,深度!这是这场面试总结出来的. 凭记忆分享下笔试,面试题.大家一起解决,然后分享下该看什么书,可以解决 ...

  7. 异曲同工的AWK语句,学习

    输出每个IP的网络连接数,是作很多事情的第一步: netstat -nat | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n ne ...

  8. Powershell 定义文本

    使用引号可以定义字符串,如果想让自己定义的字符串原样输出,可以使用单引号. 1 2 $text='$fei $(tai) $env:windir 飞苔博客 (20+2012)' $text 输出: $ ...

  9. 在OCX初始化时获取其在网页中的DOM对象

    OCX初始化的时候会调用SetClientSite,会传入IOleClientSite对象. CComQIPtr<IOleControlSite, &IID_IOleControlSit ...

  10. poj3358:欧拉定理

    又是一道用欧拉定理解的题..嗯,关键还是要建好方程,注意一些化简技巧 题目大意: 给定一个由 p / q 生成的循环小数,求此循环小数在二进制表示下的最小循环节以及不是循环节的前缀 思路: 小数化为二 ...