Comet服务器推送与SignalR
HTTP协议是一个典型的Request/Response协议,是基于TCP/IP之上的一个应用层协议,该协议最典型的特点就是无状态且需要客户端发起Request服务端才能进行Response,这意味着服务端无法主动“推送”信息。但现代很多应用需求这种“服务端推送”,比如说监控系统、报价系统、游戏、协同文档、进度条等应用。因此本文会谈论服务器推送技术的不同手段,以及在Asp.Net中的SignalR是如何封装这些细节来达到推送的目的。
实现服务器推送的一些手段
由于HTTP协议并不支持全双工,因此目前对于服务器“推送”的手段也是根据HTTP协议的特性玩了很多小花招。但大体上可以分为高端大气的全双工类和略微tricky的长轮询类。Streaming类通常会有比较多的限制,比如说对浏览器的版本要求、需要使用sliverlight或flash等查件来实现全双工等。长轮询类主要是包括长轮询或不间断Ajax请求等。
Ajax定期请求方式
这种方式严格来说并不算是服务器推送,而是客户端在一个比较短的间隔内定期去服务器用Ajax请求信息,如果服务器端有了新的事件,则客户端在下一次请求就会获取到,并在客户端调用对应的回调函数来处理这些信息。简单的示意图如图1所示。

图1.Ajax定期请求
当然,这种方式的一些缺点也是显而易见的,首先定期发起请求会白白消耗服务器资源,其次,这种方式也并不是真正的“实时”。
长连接的方式
长连接是另一种方式,是对于页面挂起一个额外的Ajax请求,当服务器有事件发生时,将请求返回给客户端,并在此挂起一个长连接。从而避免了定期请求的损耗,如图2所示。

图2.长连接方式
这种方式的缺点同样显而易见,就是需要客户端和服务器对于这部分功能写自定义实现代码。
使用插件方式
使用诸如silverlight和flash等插件可以基于socket做全双工的通信,但这种方式需要特定的客户端,跨平台性并不好(比如手机客户端等不支持一些插件,PC端没有预装Silverlight等)。对条件限制比较严格。
Forever iFrame
这种方式本质上和长连接的方法非常类似,就是在页面中嵌入一个iframe元素,该元素的Src属性指向被请求的对象,服务端有事件发生就,就回传一个调用客户端JS方法的JS。Iframe中HTTP头的Transfer-Encoding属性为chunked,这意味着服务端并不知道要发送给客户端多少数据,也就隐式意味着该连接的长度为无限。
HTML5 Web Socket
WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 WebSocket通信协议于2011年被IETF定为标准 RFC 6455,WebSocketAPI被W3C定为标准。
在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。
WebSocket协议的出现可以避免上述几种方式带来的服务器资源占用和宽带占用。但缺点也是很明显的,对客户端和服务端都有一定要求,包括浏览器的版本和服务器的版本(比如IIS7.5+)
SignalR?
上面说到了这么多中实现实时应用程序的办法,作为Asp.net框架中,提供了一个叫SignalR的框架来封装这些网络细节,SignalR会自动选择合适的实现技术来实现该种实时程序。我们只要关注更高层面的业务实现,而无需关注技术上的实现细节。
SignalR最低需要基于Jquery 1.6.4,在服务端至少需要是.Net FrameWork 4.0+。
使用SignalR会自动根据环境选择合适的网络实现细节,该过程根据微软的官网定义如下:
- 如果浏览器是IE8或低于IE8,使用长连接方式。
- 如果配置了JSONP参数,则使用长连接方式。
- 如果请求跨域,且客户端和服务器端都支持Web Socket,且客户端支持CORS,则使用Web Socket
- 如果没跨域,客户端和浏览器都支持的话,使用Web Socket方式
- 如果客户端或服务器端不支持Web Socket的话,会使用HTML5的Server-sent events
- 如果Server-Sent Event不被支持的话,会使用Forever iFrame
- 最后会使用长连接方式
SignalR的实现可以通过在Visual Studio的nuget来获取。SignalR从使用的角度来说模型非常简单,服务端是客户端回调用的HUB方法,而客户端只要引入了对应的JS之后,形成Hub-Proxy,使得服务端被调用后里的方法也可以回调不同的客户端。模型概念如图3所示。

图3.SignalR的Hub模型
在服务端的Hub被调用后,我们可以处理该部分代码,并针对不同的客户端返回信息,一个典型的代码如图4所示。

图4.一些返回给不同客户端的方法
而在客户端,我们仅仅需要引用SignalR的Js文件后,声明了Hub-Proxy,就可以直接调用服务器方法,如图5所示。

图5.客户端直接调用服务端的方法
我们注意到,在使用SignalR的过程中,并没有任何关于网络交互技术细节的实现,仅仅是简单的调用。SignalR已经按照本文之前所提到的那样,根据Context选择的具体的实现细节。
Comet服务器推送与SignalR的更多相关文章
- 基于comet服务器推送技术(web实时聊天)
http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将 ...
- 实现Comet(服务器推送)的两种方式:长轮询和http流
Comet 是一种高级的Ajax技术,实现了服务器向页面实时推送数据的技术,应用场景有体育比赛比分和股票报价等. 实现Comet有两种方式:长轮询与http流 长轮询是短轮询的翻版,短轮询的方式是:页 ...
- ASP.NET服务器推送及前后台实时交互
一:项目需求 页面需要做一个上传Excel功能,并处理Excel中的数据到数据库中 这是一个较为漫长的过程 这时我需要在页面上显示处理进度的提示,给用户一个良好的体验 比如给用户提示“正在上传文档”, ...
- 浅入浅出“服务器推送”之一:Comet简介
最近有个项目,其中有项需求要从服务器端主动向客户端推送数据,本以为很简单,但在实际做的过程中发现很棘手,并没有想象中的简单.从网上搜索学习,发现主流讲的还是Ajax的长轮询技术或者流技术,websoc ...
- 【DWR系列02】-DWR逆向Ajax即服务器推送
.literal { background-color: #f2f2f2; border: 1px solid #cccccc; padding: 1px 3px 0; white-space: no ...
- HTML5服务器推送消息的各种解决办法
摘要 在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知. 往BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如 ...
- SSE技术详解:一种全新的HTML5服务器推送事件技术
前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...
- Web端服务器推送技术原理分析及dwr框架简单的使用
1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切 ...
- 讲解HTML服务器推送相关技术知识(转)
1. 为什么需要服务器推送? 最大的优点:实时 健康知识平台重庆男科医院 重庆妇科医院适用场景:实时股票价格.商品价格.实时新闻.Twitter/weibo timeline.基于浏览器的聊天系统 2 ...
随机推荐
- Windows Phone 8.1 新特性 - 控件之列表选择控件
本篇我们来介绍Windows Phone 8.1 新特性中的列表选择控件. 在Windows Phone 8 时代,大家都会使用 LongListSelector 来实现列表选择控件,对数据进行分组显 ...
- idea小技巧
1.不使用import *:Setting=>Editor=>Code Style=>Java=>Imports=>Class count to use/Names co ...
- VIM使用(二) 浏览内核源代码
为了实现类似SourceInsight功能,通过VIM+Ctags+Cscope+Taglist+Source Explore +NERD Tree实现. 一, 安装插件 1)安装Ctags 和Csc ...
- 笔记:java转XML
package com.deppon.oms.module.client.pushToTianFangkeji.domain; import java.util.ArrayList; import j ...
- SHELL实现同时操作多个服务器:服务器批量管理
引言: 1.如果你想知道你所管理的几万台服务器的/home分区使用率是多少. 2.如果你想为你所管理的几万台服务器添加同一个计划任务你该怎么办? 3.如果你想让你所管理的几万台 ...
- 几个非常有用的js小函数
function $(v){ if(typeof v==="function"){ window.onload=v; }else if(typeof v==="strin ...
- samba server install
要求: create vnc service for win7 access it via vnc viewer. 1TB disk for this Centos PC is used as Sam ...
- Magicodes.WeiChat——版本发布历史
购买地址:https://item.taobao.com/item.htm?id=520205558575 您可以在新标签页打开此图,以查看原始图片. Magicodes.WeiChat为湖南心莱信息 ...
- [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统
一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...
- 设计模式之美:Private Class Data(私有类数据)
索引 意图 结构 参与者 适用性 效果 实现 实现方式(一):实现对初始化数据的封装. 意图 封装类的初始化数据,控制对类的属性的更改,并保持类数据与使用数据的方法间的隔离. Encapsulate ...