ASP.NET MVC SignalR(1):背景
系列目录:ASP.NET MVC SignalR
关键词:HTTP、轮询、WebSocket、Server-Sent Events、长轮询、forever frame。
1. HTTP
HTTP(HyperText Transfer Protocol,超文本传输协议)是Web应用程序客户端和服务器之间进行“交谈”的语言。
HTTP操作基于请求-响应模式,这种模式通常从客户端发起请求开始。同时,请求-响应模式通常也被称作拉(pull)模式:当客户端需要访问服务器上的资源时,它有目的地发起一个到服务器的连接,使用HTTP协议定义的“语言”请求所需的信息;服务器对请求进行处理并返回客户端所请求的资源,然后立即关闭该连接。当客户端每次需要获取一个新资源,都将重复这样的过程。
由此可见,整个HTTP操作是一个同步的过程:向服务器发送请求后,客户端将被迫等待;在服务器进行响应之前,它什么都不做。即便是使用Ajax技术,这种操作模式使用和遵守的仍是HTTP协议和客户端驱动的请求-响应模式。客户端始终是主动的一方,由它决定何时连接服务器。但在实时通信中,服务器应是主动的一方,可以在任何时刻向客户端发送信息,不需要客户端显式地进行请求。因此在有些情形下,HTTP并不是非常有效。
2. 轮询
当我们需要服务器自身就能成为主动向客户端发送信息的一方时,首先想到的方案应该是“轮询”。“轮询”通常指通过客户端进行周期性的连接,定期检查服务器上是否有一些相关的更新,仍然是通过HTTP的拉(pull)模式。
优点:
- 实现简单
- 适用于任何情形以及所有的服务器和浏览器
缺点:
- 频繁的连接与断开连接
- 连接数量将与客户端数量成比例增加
总之,尽管轮询实现起来比较消耗资源,但如果应用于不需要频繁更新的情形,它是一个不错的选择。
3. 推送
既然使用HTTP拉(pull)模式的应用程序效率并不是很高,自然就需要推(push)模式(服务器推送)了。
1)WebSocket
WebSocket标准包含了一套开发API,该API正由W3C(World Wide Web Consortium,万维网联盟)进行定义;此外,其通信协议正由IETF(Internet Engineering Task Force,Internet工程工作小组)负责制定。
基本上,WebSocket允许建立持久连接,这样的连接在客户端需要时发起,并一直保持开放。因此,客户端和服务器之间创建的是一条双向通道。通过这样的双向通道,通信的任何一方随时都可以向另一方发送信息。
缺点:
- 浏览器未实现WebSocket的所有功能
- 服务器也需要支持WebSocket
但毫无疑问,WebSocket技术可用来实现未来的实时推送服务。
2)Server-Sent Events
Server-Sent Events也被称作API Event Source,是W3联盟正制定的第二个标准,但目前该标准还处于候选推荐状态。它是一个相对简单的Javascript API,不需要修改底层协议,实现和使用起来比WebSocket标准要简单。
与WebSocket相比,Server-Sent Events将创建一个从服务器到客户端的单向通道,但是由客户端打开此通道。换言之,客户端订阅来自服务器的一个可用事件源,当数据通过该通道发送时,客户端接受通知。
所有通信都执行在HTTP之上。和一些更传统的连接方式相比,仅有的差别是响应中使用了Content-Type text/event-stream,这表明该连接将保持开放,因为它将用来从服务器发送连续的事件流或消息。
优点:
- 几乎目前所有的浏览器都支持该标准(除了IE和一些特定的移动浏览器)
缺点:
- 必须对使用的Content-Type进行解析
- 建立的是服务器到客户端的单向通道,如果客户端需要向服务器发送数据,它必须建立一个不同的连接才能完成,这将涉及比WebSocket更多的资源开销
4. 基于HTTP的推送
1)长轮询
这种推送技术和上文所述的轮询非常类似,但为了提高通信的效率和即时性,它也进行了某些改进。
在这种情况下,客户端同样对更新进行轮询,但与轮询不同的是:如果没有待接受的数据,连接将不会自动关闭,并且以后将再次发起。在长轮询中,连接将一直保持开放状态,直到服务器有事件要通知。
关闭由客户端发起的连接仅有两个方面的原因:
a. 服务器通过连接向客户端发送数据
b. 由于连接空闲产生了超时错误
这两种情况下,一条新的连接将立即建立,此时将再次等待更新。
此连接专门用于从服务器接收数据,如果客户端需要向上发送数据,它将以并行的方式打开一个专门用于从服务器接收数据的HTTP接连。
优点:
- 更新客户端时的延迟比较低
- 打开和关闭的连接数量减少,资源占用率比轮询低
- 不需要使用特殊的浏览器,HTTP提供的功能足矣
缺点:
- 资源消耗比其它只打开一个连接的技术要高一些
- 通知之间可能存在一些延迟
2)forever frame
forever frame巧妙利用了HTML的<IFRAME>标签来建立永久开放的连接。在某种程度上,这和Server-Sent Events非常类似。
forever frame需要客户端页面有一个<IFRAME>标签,标签源中的URL用来指定正在监听的服务器。服务器将保持此连接永久开放,并调用客户端上定义的脚本函数,通过此连接发送更新。在某种程度上,我们可能会说该技术主要取决于接收时在客户端执行的流脚本(streaming script)。
优点:
- 资源利用率非常高
- 实时效果非常好
缺点:
- 使用复杂
- 内存占用高
- 当客户端向服务器发送数据时还需要使用其它连接
5. 我们需要的不仅是推送
在异步、多用户以及实时应用的环境中,推送只是不可或缺的一部分。为了开发出这些总能令人赏心悦目的系统,还需要更多的功能和特性:
- 管理连接的用户:服务器必须知道哪些用户连接到服务,哪些用户已经断开连接,此外还需要对客户端数量不确定的所有因素进行控制。
- 管理订阅:服务器必须能够对订阅进行管理,或对接收特定类型消息的用户进行分组。
- 接收和处理操作:服务器不仅能实时地将信息发送给客户端,也能动态接收和处理信息。
- 对信息的提交进行监控:单独提供与消息排队、信息提交管理有关的一些机制,从而确保所有客户端都能被更新。
- 能够为多个客户端提供灵活易用的API
ASP.NET MVC SignalR(1):背景的更多相关文章
- AngularJS+ASP.NET MVC+SignalR实现消息推送
原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现 ...
- asp.net MVC SignalR 与数据库 实时同步显示
asp.net MVC SignalR 与数据库 实时同步显示 错误:未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持.如果希望使用通知,请为此数据库启用 ...
- ASP.Net MVC SignalR的应用
ASP.Net MVC SignalR的应用 最近做的一个MVC项目有个模块是要使用即时通信实现弹幕效果.既要考虑通信的实时性也要考虑服务器性能和资源消耗,所幸项目对浏览器的版本没有要求.所以我最先想 ...
- ASP.NET MVC SignalR
本系列博文主要介绍了 ASP.NET SignalR 的相关知识与开发,参考来源为<ASP.NET SignalR 编程实践>. 目录: SignalR背景 SignalR概述
- Asp.net MVC + Signalr 实现多人聊天室
Asp.net SignalR 简介: 首先简单介绍一下Signalr ,我也是刚接触,觉得挺好玩的,然后写了一个多人聊天室. Asp.net SignalR 是为Asp.net 开发人员提供的一个库 ...
- SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏
SignalR + KnockoutJS + ASP.NET MVC 实现井字游戏 1.1.1 摘要 今天,我们将使用SignalR + KnockoutJS + ASP.NET MVC实现一个实 ...
- ASP.NET MVC和EF集成AngularJS开发
参考资料: 如何在ASP.NET MVC和EF中使用AngularJS AngularJS+ASP.NET MVC+SignalR实现消息推送 [AngularJs + ASP.NET MVC]使用A ...
- Asp.NET MVC 使用 SignalR 实现推送功能二(Hubs 在线聊天室 获取保存用户信息)
简单介绍 关于SignalR的简单实用 请参考 Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室) 在上一篇中,我们只是介绍了简单的消息推送,今天我们来修改一下,实现 ...
- Asp.NET MVC 使用 SignalR 实现推送功能一(Hubs 在线聊天室)
简介 ASP .NET SignalR 是一个ASP .NET 下的类库,可以在ASP .NET 的Web项目中实现实时通信.什么是实时通信的Web呢?就是让客户端(Web页面)和服务器端 ...
随机推荐
- laravel下使用阿里云oss上传图片
对小公司而言,使用阿里云oss比直接买硬盘要划算的多,不管从存储性价比上还是从网速负载上.最近因为公司的项目有比较大的图片存储访问需求,所以决定使用阿里云的oss. 在研究了一下以后,摆着不自己造轮子 ...
- 有人向我反馈了一个bug
我是一个前端开发者,但我想这个故事对任何开发者都会引起共鸣的有人向你反馈了一个 bug. “26 楼会议室的灯亮着.它需要被熄灭.”bug 的备注里写道“你应该能在 5 分钟内搞定,只要按一下开关就好 ...
- nginx 均衡负载配置
nginx详细配置介绍: 参考资料:http://blog.csdn.net/xmtblog/article/details/42295181 配置实例: // nginx服务器虚拟为代理服务器和we ...
- Java中的Property类
Property是JAVA中的属性操作类,该类在java.util包中,它是HashTable的子类. 常用函数列表: l Properties() n 构造函数 l setProperty(S ...
- cocos2d-lua 3.5 android搭建步骤
cocos2d-lua 3.5 android搭建步骤 如何安装eclipse,jdk,android sdk,ndk这里都不说了,资料很多,而且以前用eclipse搭建cocos2d-x-c++的时 ...
- xutils 框架
1. android快速开发框架xUtils xUtils简介 xUtils 包含了很多实用的android工具. xUtils 支持大文件上传,更全面的http请求协议支持(10种谓词),拥有更加灵 ...
- Orchard官方文档翻译(二) 安装 Orchard
原文地址:http://docs.orchardproject.net/Documentation/Installing-Orchard 想要查看文档目录请用力点击这里 最近想要学习了解orchard ...
- Windows环境Mycat数据库分库分表中间件部署
下载地址MYCAT官方网站 jdk安装配置 首先去oracle官网下载并安装jdk8,添加环境变量,JAVA_HOME设置为D:\Worksoftware\Java\jdk1.8 CLASSPATH设 ...
- cocos2d-x Android版游戏之中国移动SDK嵌入
. 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...
- POJ2001-Shortest Prefixes-Trie树应用
沉迷WOW又颓了两天orz,暴雪爸爸要在国服出月卡了...这是要我好好学习吗?赶紧来刷题了... OJ:http://poj.org/problem?id=2001 题目大意是求所有字符串里每一个字符 ...