博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一步一步学习SignalR进行实时通信_2_Persistent Connections
阅读量:5167 次
发布时间:2019-06-13

本文共 3620 字,大约阅读时间需要 12 分钟。

目录

一步一步学习SignalR进行实时通信_2_Persistent Connections

标签(空格分隔): SignalR


前言

文章简单的介绍了下SignalR,从此篇文章就开始对SignalR进行剖析。在介绍Persistent connections之前,先简单介绍下安装signalR的方法。

我的开发环境:win10+vs2013

安装

  1. 首先我们新建一个空的MVC5的项目
    空MVC项目
  2. 通过Nuget[^Nuget]安装SignalR,通过Tools->Nuget Package Manager->Package Manager Console打开Package Manager Console
  3. 输入安装语句Install-Package Microsoft.AspNet.SignalR

    安装完成

    可以看到添加了JQuery和SignalR2.0

Persistent Connections

Persistent Connections的字面意思是持久连接,它有点类似于Sockets,在服务端和客户端都可以发送或接收数据。

映射并配置持久连接

如果我们要是实现基于PersistentConnection的实时信息传输,首先第一步我们需要在服务器启动时对_SignalR_进行配置。由于我们是基于_Owin_来实现_SignalR_的所以,我们在Startup中找到Configuration中配置,类似如果我们要实现其他的Owin框架我们也可以在这里进行配置。

  1. 映射

    using System;using System.Threading.Tasks;using Microsoft.Owin;using Owin;using SignalR_2.Models;//设置Owin的启动项[assembly: OwinStartup(typeof(SignalR_1.Startup))]namespace SignalR_·{    public class Startup    {
    public void Configuration(IAppBuilder app) { // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888 app.MapSignalR
    ("/echo"); } }}

    通过MapSignalR()方法来做映射,/echo表示将会映射到/echo,后面我我们转到MapSignalR定义

    MapSignalR

    MapSignalR()是一个扩展方法,它有许多重载方法,而我们主要关心的就是如图所示的泛型方法。这个方法的TConnection要求是一个PersistentConnection类型。

    好了,到此为止我们已经知道我们需要什么了,没必要继续深究下去。通过以上的研究,很明显,我们需要构造这么一个类去继承PersistentConnection来实现_SignalR_服务

  2. 实现SignalR服务

    我们新建一个类叫做EchoConnection,代码如下:

    using System;using System.Collections.Generic;using System.Linq;using System.Threading;using System.Threading.Tasks;using System.Web;using Microsoft.AspNet.SignalR;namespace SignalR_1.Models{    public class EchoConnection : PersistentConnection    {        ///         /// 当前连接数        ///         private static int _connections = 0;        ///         /// 连接建立时执行        ///         ///         ///         /// 
    protected override async Task OnConnected(IRequest request, string connectionId) { //原子操作,防止多条现成同时+1而只做一次变化 Interlocked.Increment(ref _connections); await Connection.Send(connectionId, "Hi, " + connectionId + "!"); await Connection.Broadcast("新连接 " + connectionId + "开启. 当前连接数: " + _connections); } /// /// 连接关闭时执行 /// /// /// ///
    protected override Task OnDisconnected(IRequest request, string connectionId) { //原子操作,防止多条现成同时-1而只做一次变化 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); } }}

    我们定义了一个EchoConnection类继承PersistentConnetion,并写了OnConnectedOnDisconnectedOnReceived、三个方法,大致功能是当客户端连接时,服务器会通过Send()方法向它打招呼,参数是他的ConnectionId,并发送广播消息给所有客户端,并使总连接数+1,当客户端关闭连接时,服务器会广播给所有客户端XXX连接关闭,并使总连接数-1

  3. 客户端实现
    persistent connections            

Echo service

对上面的代码有疑问看下面的图片

客户端和服务器

如图所示:左边是客户端的javascript代码,右边是服务器的代码

当客户端调用start方法时,会执行服务器的OnConnected方法
当客户端点击发送按钮发送消息时,服务端会在OnReceived中接收到消息
当服务端对消息进行发送或广播给客户端时,客户端receive会接收到此消息

95112215.jpg

结束语

这里通过PersistentConnection实现了在线聊天的简单例子。

注意在项目运行期间,我出现过几次程序集版本不对的情况,若出现此种情况,通过Install-Package XXX 重装该程序集或Update-Package XXX升级该程序集,一般均可解决

本文发布至

参考文献

[^Nuget]: NuGet 是免费、开源的包管理开发工具。

每天收获一点点
标签:
+加关注
5
0
上一篇:
下一篇:

转载于:https://www.cnblogs.com/owenzh/p/11163066.html

你可能感兴趣的文章
平衡二叉树(AVL Tree)
查看>>
【BZOJ3295】[Cqoi2011]动态逆序对 cdq分治
查看>>
【CF799E】Aquarium decoration 线段树
查看>>
大运飞天 鲲鹏展翅
查看>>
从ECMA到W3C
查看>>
软件工程--第十六周学习进度
查看>>
yii2 ActiveRecord多表关联以及多表关联搜索的实现
查看>>
搜狗输入法安装--ubuntu
查看>>
ps/2接口键盘的输入及显示
查看>>
Swift———a Glance(极客学院)笔记
查看>>
【poj3294-不小于k个字符串中最长公共子串】后缀数组
查看>>
java如何获取其它用户登录的真是IP地址
查看>>
Jquery通过指定层次关系获取元素
查看>>
c# for 和 foreach 的区别
查看>>
docfx (一)
查看>>
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
查看>>
深度学习之前馈神经网络(前向传播和误差反向传播)
查看>>
IEnumerable<T>和IQueryable<T>区别
查看>>
【luogu P3381 最小费用最大流】 模板
查看>>
(转)MFC界面风格
查看>>