首页 > 其他分享 >史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式

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

时间:2023-06-13 16:07:27浏览次数:65  
标签:教程 connectionId SignalR connection using NET 推送 连接



本文目录

  • 1、概述
  • 2、SignalR的永久连接类Mvc实现
  • 2.1、 创建ASP.NET Mvc项目
  • 2.2、安装Nuget包
  • 2.3、增加SignalR服务
  • 2.4、启动路由注册
  • 2.5、前端界面处理
  • 2.6、效果展示
  • 3、控制台做SignalR服务端实现
  • 4、代码下载
  • 5、参考文章


1、概述

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

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

史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式_快速开发框架


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

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

2、SignalR的永久连接类Mvc实现

在ASP.NET MVC下实现SignalR的永久连接类非常的简单,只需简单4步就可以实现一个简单的群聊功能。

2.1、 创建ASP.NET Mvc项目

史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式_敏捷开发框架_02

2.2、安装Nuget包

创建好项目后,要使用SignalR,需要先安装SignalR包,可以通过程序包管理控制台输入包安装命令进行安装。

Install-Package Microsoft.AspNet.SignalR

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

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

2.3、增加SignalR服务

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

史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式_消息推送_04


确定后,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);
        }
    }
}

我们对代码做适当修改,让业务更人性化,如下所示:

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.4、启动路由注册

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

史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式_消息推送_05

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.5、前端界面处理

前端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.6、效果展示

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


史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式_RDIFramework.NET_07

3、控制台做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();
            }
        }
    }
}

史上最全面的SignalR系列教程-2、SignalR 实现推送功能-永久连接类实现方式_快速开发框架_08

4、代码下载

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

5、参考文章


一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。

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

同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!

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

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

扫描二维码立即关注

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


标签:教程,connectionId,SignalR,connection,using,NET,推送,连接
From: https://blog.51cto.com/guosisoft/6470920

相关文章

  • 史上最全面的SignalR系列教程-目录汇总
    本文目录1、引言2、SignalR介绍3、百度百科给它的定义4、它的作用5、代码下载6、史上最全面的SignalR系列文章列表参考文章框架相关1、引言最遗憾的不是把理想丢在路上,而是理想从未上路。每一个将想法变成现实的人,都值得称赞和学习。致正在奔跑的您!2、SignalR介绍SignalR实现服务......
  • 闪烁之光手游架设教程
    准备工具:centos7.6系统服务器一台服务端开始架设安装宝塔yuminstall-ywget&.&wget-Oinstall.shhttp://download.bt.cn/install/install_6.0.sh&8shinstall.sh2、进入宝塔安装以下环境Nginx1.18MysQL5.6PHP7.0关闭防火墙和开放tcp/udp1-65535端口systemctlstartfire......
  • Arthas使用教程(8大分类)
    文章目录一、简介1、简介2、项目所在位置二、安装Arthas1、安装Arthas2、卸载Arthas3、首次启动。三、核心监视功能1、`monitor`:监控方法的执行情况2、`watch`:检测函数返回值3、`trace`:根据路径追踪,并记录消耗时间4、`stack`:输出当前方法被调用的调用路径5、`tt`:时间隧道,记录多个......
  • Axure RP教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介AxureRP是一款专业的快速原型设计工具。Axure(发音:Ack-sure),代表美国Axure公司;RP则是RapidPrototyping(快速原型)的缩写。AxureRP是美国AxureSoftwareSolution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软......
  • AWS Lambda 教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介AWSLambda是AWS在2014年推出的「无服务器」(Serverless)计算服务,用户无需管理服务器,可以更专注自己业务。由于上手简单,而且真正利用了云的优势,Lambda快速成为了一项明星服务。Lambda在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和......
  • sed简明教程——转载自左耳朵耗子博客coolshell
    <h1><aname="t0"></a><aid="sed__0"></a><aclass="hlhl-1"href="https://so.csdn.net/so/search?q=sed&amp;spm=1001.2101.3001.7020"target="_blank"rel="noopener&quo......
  • Three.js教程:渲染器
    推荐:将NSDT场景编辑器加入你的3D工具链。其他系列工具:NSDT简石数字孪生渲染器生活中如果有了景物和相机,那么如果想获得一张照片,就需要你拿着相机,按一下,咔,完成拍照。对于threejs而言,如果完成“咔”这个拍照动作,就需要一个新的对象,也就是WebGL渲染器WebGLRenderer(opensnewwin......
  • 通过 docker-compose 快速部署 StarRocks 保姆级教程
    目录一、概述二、前期准备1)部署docker2)部署docker-compose三、创建网络四、StarRocks编排部署1)下载StarRocks部署包2)配置3)启动脚本bootstrap.sh4)构建镜像Dockerfile5)编排docker-compose.yaml6)开始部署五、简单测试验证六、常用的StarRocks客户端命令1)服务启停2、查看节......
  • 【保姆级教学】抓包工具Wireshark使用教程
    wireshark介绍今天讲一下另一款底层抓包软件,之前写过两篇抓包软件分别是fiddler抓包【https://www.cnblogs.com/zichliang/p/16067941.html】mitmdump抓包【https://www.cnblogs.com/zichliang/p/16067941.html】Wireshark(前身Ethereal)是一个网络包分析工具该工具主要......
  • 教程|如何将本地环境移植到矩池云实例
    前提你本地环境是conda环境,最好是miniconda创建的租用机器必须和本地系统保持一致,目前矩池云有:Windows和Linux系统实例。本地环境打包使用condapack可以将系统中的conda环境整个打包。安装pipinstallconda-pack导出condapack-n你的conda环境名称......