一步一步学习SignalR进行实时通信_2_Persistent Connections
2015-08-10 21:45
344 查看
一步一步学习SignalR进行实时通信\_2_Persistent Connections
SignalR
一步一步学习SignalR进行实时通信_2_Persistent Connections前言
安装
Persistent Connections映射并配置持久连接
结束语
参考文献
前言
上一篇文章简单的介绍了下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=316888[/code]app.MapSignalR<EchoConnection>("/echo");}}}
[/code]通过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);}}}
[/code]我们定义了一个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>
[/code]对上面的代码有疑问看下面的图片如图所示:左边是客户端的javascript代码,右边是服务器的代码
当客户端调用start方法时,会执行服务器的OnConnected方法
当客户端点击发送按钮发送消息时,服务端会在OnReceived中接收到消息
当服务端对消息进行发送或广播给客户端时,客户端receive会接收到此消息结束语
这里通过PersistentConnection实现了在线聊天的简单例子。注意在项目运行期间,我出现过几次程序集版本不对的情况,若出现此种情况,通过源码下载Install-Package XXX重装该程序集或Update-Package XXX升级该程序集,一般均可解决
本文发布至作业部落参考文献
SignalR Programming in Microsoft ASP.NET pdf 下载
[1] NuGet 是免费、开源的包管理开发工具。 ↩
相关文章推荐
- Spring面试问答
- poj 3723 Conscription(最大生成树)
- 老友记高清十季全
- 用过滤器过滤全站非法字符
- kmp(第二次个人赛)*(重复次数->长度最长)
- 搜索和搜索形式(SEARCHING and its forms)
- ASP.NET并发处理
- 【Powershell】【AD】AD属性的修改
- JQuery根据字母检索元素并导航到指定位置
- hdu 1133 Buy the Ticket
- I - Control - HDU 4289 (最大流)
- 滚动数组
- js倒计时如火车站买火车票后15分钟必须付款否则取消火车票
- Apache OFbiz MiniLang 源码解读
- 将XML文件转化成NSData对象
- [转]Java中子类调用父类构造方法的问题分析
- Rescue
- boost学习之二(时间 timer库)
- 115个Java面试题和答案——终极列表(下)
- dense_rank()+hash提示改写优化SQL