一步一步学习SignalR进行实时通信_2_Persistent Connections
原文:一步一步学习SignalR进行实时通信_2_Persistent Connections
一步一步学习SignalR进行实时通信\_2_Persistent Connections
SignalR
前言
上一篇文章简单的介绍了下SignalR,从此篇文章就开始对SignalR进行剖析。在介绍Persistent connections之前,先简单介绍下安装signalR的方法。
我的开发环境:win10+vs2013
安装
- 首先我们新建一个空的MVC5的项目

- 通过Nuget[1]安装SignalR,通过
Tools->Nuget Package Manager->Package Manager Console打开Package Manager Console - 输入安装语句
Install-Package Microsoft.AspNet.SignalR
可以看到添加了JQuery和SignalR2.0
Persistent Connections
映射并配置持久连接
如果我们要是实现基于
PersistentConnection的实时信息传输,首先第一步我们需要在服务器启动时对SignalR进行配置。由于我们是基于Owin来实现SignalR的所以,我们在Startup中找到Configuration中配置,类似如果我们要实现其他的Owin框架我们也可以在这里进行配置。
映射
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=316888app.MapSignalR<EchoConnection>("/echo");}}}
通过
MapSignalR()方法来做映射,/echo表示将会映射到/echo,后面我我们转到MapSignalR定义
" title="">MapSignalR()是一个扩展方法,它有许多重载方法,而我们主要关心的就是如图所示的泛型方法。这个方法的TConnection要求是一个PersistentConnection类型。好了,到此为止我们已经知道我们需要什么了,没必要继续深究下去。通过以上的研究,很明显,我们需要构造这么一个类去继承
PersistentConnection来实现SignalR服务实现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{/// <summary>/// 当前连接数/// </summary>private static int _connections = 0;/// <summary>/// 连接建立时执行/// </summary>/// <param name="request"></param>/// <param name="connectionId"></param>/// <returns></returns>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);}/// <summary>/// 连接关闭时执行/// </summary>/// <param name="request"></param>/// <param name="connectionId"></param>/// <returns></returns>protected override Task OnDisconnected(IRequest request, string connectionId){//原子操作,防止多条现成同时-1而只做一次变化Interlocked.Decrement(ref _connections);return Connection.Broadcast(connectionId + " 连接关闭. 当前连接数: " + _connections);}/// <summary>/// 连接开始时执行/// </summary>/// <param name="request"></param>/// <param name="connectionId"></param>/// <param name="data"></param>/// <returns></returns>protected override Task OnReceived(IRequest request, string connectionId, string data){var message = connectionId + ">> " + data;return Connection.Broadcast(message);}}}
我们定义了一个
EchoConnection类继承PersistentConnetion,并写了OnConnected、OnDisconnected、OnReceived、三个方法,大致功能是当客户端连接时,服务器会通过Send()方法向它打招呼,参数是他的ConnectionId,并发送广播消息给所有客户端,并使总连接数+1,当客户端关闭连接时,服务器会广播给所有客户端XXX连接关闭,并使总连接数-1客户端实现
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><title>persistent connections</title><script src="Scripts/jquery-1.10.2.min.js"></script><script src="Scripts/jquery.signalR-2.0.0.min.js"></script></head><body><h1>Echo service</h1><div><input type="text" id="text" /><button id="send">Send</button></div><script>$(function () {var connection = $.connection("/echo");connection.logging = true;connection.received(function (data) {$("body").append(data + "<br />");});connection.error(function (err) {alert("存在一个错误. \n" +"Error: " + err.message);});connection.start().done(function () {$("#send").click(function () {connection.send($("#text").val());$("#text").val("").focus();});});});</script></body></html>
对上面的代码有疑问看下面的图片

如图所示:左边是客户端的javascript代码,右边是服务器的代码
当客户端调用start方法时,会执行服务器的OnConnected方法
当客户端点击发送按钮发送消息时,服务端会在OnReceived中接收到消息
当服务端对消息进行发送或广播给客户端时,客户端receive会接收到此消息

结束语
这里通过PersistentConnection实现了在线聊天的简单例子。
注意在项目运行期间,我出现过几次程序集版本不对的情况,若出现此种情况,通过
Install-Package XXX重装该程序集或Update-Package XXX升级该程序集,一般均可解决
参考文献
SignalR Programming in Microsoft ASP.NET pdf 下载
[1] NuGet 是免费、开源的包管理开发工具。 ↩
一步一步学习SignalR进行实时通信_2_Persistent Connections的更多相关文章
- 一步一步学习SignalR进行实时通信_1_简单介绍
一步一步学习SignalR进行实时通信\_1_简单介绍 SignalR 一步一步学习SignalR进行实时通信_1_简单介绍 前言 SignalR介绍 支持的平台 相关说明 OWIN 结束语 参考文献 ...
- 一步一步学习SignalR进行实时通信_8_案例2
原文:一步一步学习SignalR进行实时通信_8_案例2 一步一步学习SignalR进行实时通信\_8_案例2 SignalR 一步一步学习SignalR进行实时通信_8_案例2 前言 配置Hub 建 ...
- 一步一步学习SignalR进行实时通信_9_托管在非Web应用程序
原文:一步一步学习SignalR进行实时通信_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信\_9_托管在非Web应用程序 一步一步学习SignalR进行实时通信_9_托管在非We ...
- 一步一步学习SignalR进行实时通信_7_非代理
原文:一步一步学习SignalR进行实时通信_7_非代理 一步一步学习SignalR进行实时通信\_7_非代理 SignalR 一步一步学习SignalR进行实时通信_7_非代理 前言 代理与非代理 ...
- 一步一步学习SignalR进行实时通信_5_Hub
原文:一步一步学习SignalR进行实时通信_5_Hub 一步一步学习SignalR进行实时通信\_5_Hub SignalR 一步一步学习SignalR进行实时通信_5_Hub 前言 Hub命名规则 ...
- 一步一步学习SignalR进行实时通信_6_案例
原文:一步一步学习SignalR进行实时通信_6_案例 一步一步学习SignalR进行实时通信\_6_案例1 一步一步学习SignalR进行实时通信_6_案例1 前言 类的定义 各块功能 后台 上线 ...
- 一步一步学习SignalR进行实时通信_4_Hub
原文:一步一步学习SignalR进行实时通信_4_Hub 一步一步学习SignalR进行实时通信\_4_Hub SignalR 一步一步学习SignalR进行实时通信_4_Hub 前言 创建Hub 配 ...
- 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域
原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...
- 12.Linux软件安装 (一步一步学习大数据系列之 Linux)
1.如何上传安装包到服务器 有三种方式: 1.1使用图形化工具,如: filezilla 如何使用FileZilla上传和下载文件 1.2使用 sftp 工具: 在 windows下使用CRT 软件 ...
随机推荐
- 64位ubuntu编译32位程序
最近在64位ubuntu上开发,需要编译32位程序,需要安装这两个包,然后在编译器参数加上-m32.不放心的话可以用ldd或file查看一下是否生成了对应位数的程序. $ apt-get inst ...
- js点击更多显示更多内容效果
我写了一个简单的分段显示插件,用法很简单:1,把你要分面显示的内容的容器元素增加一个class=showMoreNChildren,并增加一个自定义属性pagesize="8" 这 ...
- PHP利用递归法获取多级类别的树状数组
数据结构:category(id, pid, name),对应:信息ID,父项ID,类别名 测试数据: $aryCate = array( array('id' => 1, 'pid' => ...
- 说出x的结果,并解释为什么?
var x = 1; if(function f(){}){ x += typeof f; } x; //x的结果是? x=1undefined 首先是 if表达式的问题 if括号里,不一定非要用== ...
- C#学习日志 day8 -------------- async await 异步方法入门(引用博客)以及序列化和反序列化的XML及json实现
首先是异步方法的介绍,这里引用自http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html async and await 简单的 ...
- Java引用数据类型
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值.引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应 ...
- CSS自学笔记(7):CSS定位
很多时候,我们需要对一些元素进行自定义排序.布局等,这是就需要用到CSS的定位属性了,用这些属性对一些元素进行自定义排序.布局等操作,可以改变浏览器默认的死板的排序. CSS定位的功能很容易理解,它允 ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
- C语言 格式说明符
整数 lL代表long %#0 和%#x 可打印出八进制和十六进制前缀 short int long long long 无符号 八进制 %ho %o %Lo %LLo 十进制 %hu %u %Lu ...
- Codis集群的搭建
Codis集群的搭建与使用 一.简介 Codis是一个分布式的Redis解决方案,对于上层的应用来说,连接Codis Proxy和连接原生的Redis Server没有明显的区别(不支持的命令列表 ...