1、概述

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

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

对于这两种方式的讨论,感兴趣的朋友可以移步: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项目

2.2、安装Nuget包

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

Install-Package Microsoft.AspNet.SignalR

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

2.3、增加SignalR服务

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

确定后,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启动类。

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、效果展示

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();
}
}
}
}

4、代码下载

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

5、参考文章


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

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

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

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

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

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

扫描二维码立即关注

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

  1. 史上最全面的SignalR系列教程-3、SignalR 实现推送功能-集线器类实现方式

    1.概述 通过前两篇 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 文章对SignalR的介绍, ...

  2. 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  3. 史上最全面的SignalR系列教程-5、SignalR 实现一对一聊天

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  4. 史上最全面的SignalR系列教程-6、SignalR 实现聊天室

    1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...

  5. 史上最全面的SignalR系列教程-目录汇总

    1.引言 最遗憾的不是把理想丢在路上,而是理想从未上路. 每一个将想法变成现实的人,都值得称赞和学习. 致正在奔跑的您! 2.SignalR介绍 SignalR实现服务器与客户端的实时通信 ,她是一个 ...

  6. .Net魔法堂:史上最全的ActiveX开发教程——ActiveX与JS间交互篇

    一.前言 经过上几篇的学习,现在我们已经掌握了ActiveX的整个开发过程,但要发挥ActiveX的真正威力,必须依靠JS.下面一起来学习吧! 二.JS调用ActiveX方法 只需在UserContr ...

  7. .Net魔法堂:史上最全的ActiveX开发教程——开发篇

    一.前言 在设计某移动内部自动化运维平台时,经综合考虑终端机性能和功能需求等因素后,决定采用B/S模式,并且浏览器通过ActiveX组件实现与服务器Agent作P2P的通讯.好处,整个平台以网页形式存 ...

  8. .Net魔法堂:史上最全的ActiveX开发教程——自动更新、卸载篇

    一.前言 B/S模式的特点之一,客户端版本升级相对简单.快捷,适合产品的快速迭代.而ActiveX组件的自动更新同样也继承了这一优点.下面我们一起来了解吧! 二.二话不说更新ActiveX 1. 设置 ...

  9. .Net魔法堂:史上最全的ActiveX开发教程——部署篇

    一.前言 接<.Net魔法堂:史上最全的ActiveX开发教程——发布篇>,后我们继续来部署吧! 二. 挽起衣袖来部署   ActiveX的部署其实就是客户端安装ActiveX组件,对未签 ...

随机推荐

  1. 基础数据类型,格式化输出,以及for循环的使用

    基础数据类型总览 int :数字类型,可以+-*/等等操作 str:字符串类型,存储少量的数据,+*int 切片等 bool :里面包含True,False这两种值,用来判断真假. list :列表 ...

  2. POI 身份证号码 手机号 日期值的处理方式

    private static SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ...

  3. Python入门基础(2)

    如果你是博客园团队,,看到不符合您们要求的地方可否指出来?不要你不符合要求,然后我不符合哪项要求?是要我自己去找么? python条件语句 首先介绍的是if语句,python中的if语句格式如下: i ...

  4. Mybatis__模糊查询

    在一个Web工程中,查询功能几乎都要用到姓名模糊查询,,虽然学号,工号等可以最准确最快的定位,但如果清楚信息到连学号,工号都一个数不差,应该也没必要去查询了. 故需要用到一下语句实现模糊查询: sel ...

  5. Spark 中的机器学习库及示例

    MLlib 是 Spark 的机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模.MLlib 由一些通用的学习算法和工具组成,包括分类.回归.聚类.协同过滤.降维等,同时还包括底层的优化 ...

  6. MYSQL语句强化练习

    之前发现自己写sql不怎么得心应手,总是百度零零散散的学习一下,所以在空闲的时候自己就专门找一下mysql的强化题敲一下练习一下,简要记录一下,sql写着写着就会越来越熟练,总之要自己加油! 表结构 ...

  7. 一篇文章学会Docker命令

    目录 简介 镜像仓库 login pull push search 本地镜像管理 images rmi tag build history save load import 容器操作 ps inspe ...

  8. android_ratingBar

    主文件 package cn.com.sxp;import android.app.Activity;import android.os.Bundle;import android.util.Log; ...

  9. 预学第三天:Ge常用t快捷键,码云,Git使用

    目录 Get常用快捷键 码云及Git的使用 Get常用快捷键 git init #创建一个本地的仓库 **gie add test.txt #指定文件添加 ***git add . #当前文件夹下所有 ...

  10. 【题解】旅行-C++

    Description 某趟列车的最大载客容量为V人,沿途共有n个停靠站,其中始发站为第1站,终点站为第n站.在第1站至第n-1站之 间,共有m个团队申请购票搭乘,若规定:(1)对于某个团队的购票申请 ...