详解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

时间: 2024-09-08 03:30:14

详解Comet服务器推送与SignalR的相关文章

Comet服务器推送,在IIS上需要怎么配置?

问题描述 Comet服务器推送,在IIS上需要怎么配置? 解决方案 解决方案二:好像要配什么映射文件.解决方案三:我也看到有人这么说但具体配置什么没人提~

基于comet服务器推送技术(web实时聊天)

原文 http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据. 主要思想:服务器端将数据推送到客户端(浏览器) 本人做了简单的web实时聊天系统:服务器推送(聊天).zip 系统简单说明如下: { 系统所用数据库:sqlite数据库 UserInfo:用户信息表 UserRelation:用户关系表

详解iOS本地推送与远程推送_IOS

一.简介 分为本地推送和远程推送2种.可以在应用没有打开甚至手机锁屏情况下给用户以提示.它们都需要注册,注册后系统会弹出提示框(如下图)提示用户是否同意,如果同意则正常使用:如果用户不同意则下次打开程序也不会弹出该提示框,需要用户到设置里面设置.一共有三种提示类型: UIUserNotificationTypeBadge:应用图标右上角的信息提示 UIUserNotificationTypeSound:播放提示音 UIUserNotificationTypeAlert:提示框 二.本地推送 1

comet实现服务器推送技术出现了一些问题

问题描述 comet实现服务器推送技术出现了一些问题 如题 自己写的基于comet服务器推送信息的网站,自己调试的时候没有问题,数据能够更改. 但是 发布到IIS上, 用别的电脑访问的时候,数据不能更改,感觉没有运行代码. 这两台电脑的 防火墙都是关闭的~ js $(function () { a(); } function a(){ $.ajax({ url: "../../NetAnomaly.ashx?"+Math.random(), type: "post"

深入了解 Dojo 的服务器推送技术

服务器推送技术和 Bayeux 协议简介 服务器推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息.服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的连接.当服务器需要再次发送一批数据时,浏览器显示数据并保持连接.以后,服务器仍然可以发送批量数据,浏览器继续显示数据,依次类推.基于这种思想,这里我们要引出 Bayeux 协议. Bayeux 是一套基于 Publish / Subscribe 模式,以 JSON 格式在浏览器与服务器之间传输事件的通信协议.该协议规定了浏览器与

HTML5服务器推送技术的相应实现细节

对于某些类型的应用来说,服务器推送事件是最佳的选择.本文对服务器推送技术进行了详细的介绍,包含浏览器端和服务器端的相应实现细节,为在实践中使用该技术提供了指南. 对于一般的 Web 应用开发,大多数开发人员并不陌生.在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式.浏览器发出请求,服务器根据收到的请求来生成相应的响应.浏览器再对收到的响应进行处理,展现给用户.响应的格式可能是 HTML.XML 或 JSON 等.随着 REST 架构风格和 AJAX 的流行,服务器更多地使用

ios-使用AsycSocket怎样获取服务器推送消息

问题描述 使用AsycSocket怎样获取服务器推送消息 公司要实现一个消息推送,我这边使用AsycSocket 连接之后只有自己发送一个请求才能收到推送消息请问如何能直接收到推送消息? 解决方案 是不是对方有要求,要应答式的,收到你的才能发给你 解决方案二: 不是,因为是为了实现三端统一数据,PC或者安卓那边有一端有一个数据提交的服务器,如果提交成功的话就会给别的客户端(登录的用户)发送这个新的消息, 解决方案三: 不是,因为是为了实现三端统一数据,PC或者安卓那边有一端有一个数据提交的服务器

Android不同应用如何筛选服务器推送消息?

问题描述 Android不同应用如何筛选服务器推送消息? 现在我们自己建一个推送系统.客户端可以通过推送接收到服务器端的消息.而我有多个客户端应用要使用这个系统,为了节约服务器资源,我们想一个手机和服务器建立一条链接,避免资源的浪费.你有什么办法解决这个问题?会使用哪些技术? 解决方案 可以参照_极光推送_的一些机制. 每个客户端与服务器连接的时候可以绑定一个**标签(Tag)**或者**设备别名(Alias)**或者**唯一标识(Registration ID)**. 这样服务器就可以 1.

windows8 1-怎样拒绝域服务器推送过来的自动安装程序

问题描述 怎样拒绝域服务器推送过来的自动安装程序 各位大大,我们公司的计算机在加域以后,开机会自动安装一个监控软件.由于我的系统和监控软件不兼容,会导致我电脑内所有的exe文件无法使用. 请问怎样做,才能够在开机的时候能够拒绝域服务器推送过来的一切脚本.安装程序等. 解决方案 恩,联系你的域管理员,更改组策略