史上最全面的SignalR系列教程-二、SignalR 实现推送功能-永久链接类实现方式

一、概述

经过上篇史上最全面的SignalR系列教程-一、认识SignalR文章的介绍,咱们对SignalR技术已经有了一个全面的了解。本篇开始就经过SignalR的典型应用的实现方式作介绍,例子虽然简单,但麻雀虽小五脏俱全。能够以此为基础,扩展到实际应用中。html

SignalR 的实现机制与.NET WCF 或 Remoting 是类似的,都是使用远程代理来实现。在具体使用上,有两种不一样通讯模型:PersistentConnection 和 Hubs,其中 PersistentConnection 是实现了长时间的 Javascript 轮询(相似于 Comet),Hub 是用来解决实时信息交换问题,它是利用 Javascript 动态载入执行方法实现的。SignalR 将整个链接,信息交换过程封装得很是漂亮,客户端与服务器端所有使用 JSON 来交换数据。前端

对于这两种方式的讨论,感兴趣的朋友能够移步:https://stackoverflow.com/questions/9280484/signalr-why-choose-hub-vs-persistent-connectionhtml5

本篇主要介绍使用SignalR的永久链接类(Persistent Connections)的实现方式来实现消息推送(广播)功能,分别以Asp.NET MVC与控制台程序作实例演示。对于Hubs这种集线器的实现方式在下篇文章介绍。jquery

二、SignalR的永久链接类Mvc实现

在ASP.NET MVC下实现SignalR的永久链接类很是的简单,只需简单4步就能够实现一个简单的群聊功能。git

2.一、 建立ASP.NET Mvc项目

2.二、安装Nuget包

建立好项目后,要使用SignalR,须要先安装SignalR包,能够经过程序包管理控制台输入包安装命令进行安装。github

Install-Package Microsoft.AspNet.SignalR

也可使用界面方式,以下图所示。web

安装SignalR包-Microsoft.AspNet.SignalR

2.三、增长SignalR服务

规划适当的SignalR服务文件存放的文件夹,如咱们放在Connections文件夹中,在此文件夹右键选择新建项,咱们选择SignalR Persistent Connection Class永久链接类项。服务器

添加SignalR服务

肯定后,VS会自动给咱们生成对应代码,以下:微信

using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
 
namespace SignalRTestProj_1.Connections
{
    public class ChatConnection : PersistentConnection
    {
        protected override Task OnConnected(IRequest request, string connectionId)
        {
            return Connection.Send(connectionId, "Welcome!");
        }
 
        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            return Connection.Broadcast(data);
        }
    }
}

咱们对代码作适当修改,让业务更人性化,以下所示:websocket

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;


namespace SignalRTestProj_1.Connections
{
    using Microsoft.AspNet.SignalR;

    public class ChatConnection : PersistentConnection
    {
        private static int _connections = 0;

        protected override Task OnConnected(IRequest request, string connectionId)
        {
            Interlocked.Increment(ref _connections);
            //广播消息
            Connection.Broadcast("新的链接加入,链接ID:" + connectionId + ",已有链接数:" + _connections);
            return Connection.Send(connectionId, "双向链接成功,链接ID:" + connectionId);
        }

        /// <summary>
        /// 链接断开 
        /// </summary>
        protected override Task OnDisconnected(IRequest request, string connectionId, bool stopCalled)
        {
            Interlocked.Decrement(ref _connections);
            return Connection.Broadcast(connectionId + "退出链接,已有链接数:" + _connections);
        }

        protected override Task OnReceived(IRequest request, string connectionId, string data)
        {
            var message = connectionId + "发送内容>>" + data;
            return Connection.Broadcast(message);
        }
    }
}

2.四、启动路由注册

要使Signal启做用,咱们必须启动路由注册,要让客户端能找到,咱们使用Owin。以下图所示,咱们添加一个Owin Start启动类。

增长Startup启动类

using Microsoft.Owin;
using Owin;
using SignalRTestProj_1.Connections;

[assembly: OwinStartup(typeof(SignalRTestProj_1.App_Start.ChartStartup))]

namespace SignalRTestProj_1.App_Start
{
    public class ChartStartup
    {
        public void Configuration(IAppBuilder app)
        {
            // 有关如何配置应用程序的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkID=316888
            // 配置上文实现的ChatConnections
            app.MapSignalR<ChatConnection>("/Connections/ChatConnection");
        }
    }
}

至此,咱们服务端就算搭建起来了,如今咱们增长一个页面来实现调用。

2.五、前端界面处理

前端js实现消息广播,并实时记录

<html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>SignalR永久链接类 Demo</title>
        <script src="~/Scripts/jquery-3.3.1.min.js"></script>
        <script src="~/Scripts/jquery.signalR-2.4.1.min.js"></script>
    </head>
    <body>
        <div>
            <h1>SignalR永久链接类 Demo</h1>
            <div>
                <input type="text" id="msgContext" placeholder="请输入消息内容...." />
                <button id="sendMessage" class="btn-primary">Send</button>            
                <ul id="messages"></ul>
            </div>
            <script>
                var connection = $.connection("/Connections/ChatConnection");
                connection.logging = true;
                //客户端接收消息
                connection.received(function (data) {
                    $('#messages').append('<li>' + data + '</li>');
                });
                //链接错误处理
                connection.error(function (err) {
                    alert('与服务器链接报错:'+ err.message);
                });
                //链接成功
                connection.start().done(function () {
                    $('#sendMessage').click(function () {
                        var val = $('#msgContext').val();
                        //向服务器端发送消息
                        connection.send(val);
                    });
                });
            </script>
        </div>
    </body>
</html>

OK,全面完成,F5运行看效果吧。

2.六、效果展现

三、控制台作SignalR服务端实现

除了Web实时应用以外,咱们还能够用其余应用程序实现实时交互,如控制台。
只须要Install-Package Microsoft.AspNet.SignalR.Client命令,示例代码以下:

using Microsoft.AspNet.SignalR.Client;
using static System.Console;

namespace ClientWithSignalRDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var connection = new Connection("http://localhost:65309/Connections/ChatConnection");

            connection.Received += WriteLine;
            connection.Start().Wait();

            string line;
            while ((line = ReadLine()) != null)
            {
                connection.Send(line).Wait();
            }
        }
    }
}

四、代码下载

实例源码能够移步github下载,地址:https://github.com/yonghu86/SignalRTestProj

五、参考文章


一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,你们能够经过下面的地址了解详情。

RDIFramework.NET官方网站:http://www.rdiframework.net/

RDIFramework.NET官方博客:http://blog.rdiframework.net/

同时须要说明的,之后的全部技术文章以官方网站为准,欢迎你们收藏!

RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用!

欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。

扫描二维码当即关注

微信号:guosisoft

相关文章
相关标签/搜索