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会自动根据环境选择合适的网络实现细节,该过程根据微软的官网定义如下:

  1. 如果浏览器是IE8或低于IE8,使用长连接方式。
  2. 如果配置了JSONP参数,则使用长连接方式。
  3. 如果请求跨域,且客户端和服务器端都支持Web Socket,且客户端支持CORS,则使用Web Socket
  4. 如果没跨域,客户端和浏览器都支持的话,使用Web Socket方式
  5. 如果客户端或服务器端不支持Web Socket的话,会使用HTML5的Server-sent events
  6. 如果Server-Sent Event不被支持的话,会使用Forever iFrame
  7. 最后会使用长连接方式

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选择的具体的实现细节。

转载于:https://www.cnblogs.com/CareySon/p/3519007.html

Comet服务器推送与SignalR相关推荐

  1. java推送技术_java网络编程 - java服务器推送技术系列方案实战

    前言 服务器推送技术(又名Comet)是建立在ARP基础之上的一种非常实用的技术,它广泛应用于Web端,手机APP应用端等.具体很多场景都需要此技术的支撑,包括扫码登录.扫码支付.网页支付.端到端消息 ...

  2. HTML5 服务器推送事件(Server-sent Events)实战开发

    对于一般的 Web 应用开发,大多数开发人员并不陌生.在 Web 应用中,浏览器和服务器之间使用的是请求 / 响应的交互模式.浏览器发出请求,服务器根据收到的请求来生成相应的响应.浏览器再对收到的响应 ...

  3. Spring之WebSocket网页聊天以及服务器推送

    Spring之WebSocket网页聊天以及服务器推送 转自:http://www.xdemo.org/spring-websocket-comet/ /Springframework /Spring ...

  4. sql server无法绑定由多个部分组成的标识符_HTML5服务器推送事件(Server-sent-event)...

    在前端开发中,实现界面推送的方式,这里大概总结下三种方式 轮询(ajax),比较耗费服务器资源.COMET方式(COMET 技术并不是 HTML 5 ) websocket 双向数据推送,灵活,功能强 ...

  5. html5服务器推送消息的各种解决办法,WEB服务器推送消息的各种解决办法

    前言:在各种BS架构的应用程序中,往往都希望服务端能够主动地向客户端推送各种消息,以达到类似于邮件.消息.待办事项等通知.而BS架构本身存在的问题就是,服务器一直采用的是一问一答的机制.这就意味着如果 ...

  6. 服务器推送技术之短轮询、长轮询、SSE和Websocket

    服务器推送技术 服务器推送技术干嘛用?就是让用户在使用网络应用的时候,不需要一遍又一遍的去手动刷新就可以及时获得更新的信息.大家平时在上各种视频网站时,对视频节目进行欢乐的吐槽和评论,会看到各种弹幕, ...

  7. comet - “服务器推”技术

    概念 comet :基于 HTTP 长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向 客户端程序推送数据,而不需要客户 ...

  8. 网络编程五-服务器推送技术

    目录 一.服务器推送技术 1.服务器推送技术的兴起 2.应用场景 二.Ajax短轮询 1.定义 2.特点 三.Comet 3.1 AJAX 的长轮询 1.定义 2.特点 3.2 SSE 1.定义 2. ...

  9. 服务器推送技术Server Push详解

    服务器推送技术(Server Push)是最近Web技术中最热门的一个流行术语,它的别名叫Comet(彗星).它是继AJAX之后又一个倍受追捧的Web技术.服务器推送技术最近的流行与AJAX有着密切的 ...

最新文章

  1. 在java的程序里date类型比较大小
  2. Leangoo研发管理软件甘特图6.0.2 版发布
  3. 充分理解HP Flex-10和VMware的端口映射关系
  4. html中事件处理中的this和event对象
  5. WinAPI: waveOutMessage - 向波形输出设备发送一条消息
  6. RDS最佳实践(三)—如何制定相关的流程来规范RDS的使用
  7. Android Monkey(转载)
  8. librosa能量_librosa与python_speech_features
  9. Python 高级网络操作 - Python Advanced Network Operations
  10. 数据分析李小璐PG one出轨门自卫反击战
  11. 面对imbalance data的时候
  12. Unity网络--HLAPI(1):服务器客户端变量同步,脏标识以及定制特性SyncVar
  13. RocketMQ(十二)消息堆积与消费延迟
  14. linux c语言 文件拷贝,怎么在linux下用c编程实现文件的复制
  15. 2019年第五届计蒜之道复赛总结
  16. 使用opencv-python读取webm格式的视频并转换成图片和avi格式的视频
  17. 使用pandas计算环比、同比
  18. 腾讯云手游安全MTP怎么样?腾讯云手游安全MTP值得入手吗?
  19. Tomcat 启动速度慢,一直转圈的原因
  20. 如何选购一台笔记本电脑

热门文章

  1. python测控_基于RN8302和Python的电能测控系统设计
  2. Python为你打开一扇门
  3. SOS宣布与融合子公司成立一家合资企业,专注区块链资产和加密货币等业务
  4. SAP License:获利分析的两种方式比较
  5. SAP License:我们到底需要什么能力?
  6. 电商后台、手机端、小程序、H5、电商原型、需求池、产品结构图、接口流程、高保真交互、PRD、布局说明、数据统计、店铺管理、商品管理、财务管理、售后、订单、会员、客服、标签、Axure原型、产品原型
  7. 微信小程序 - 自定义switch切换(示例)
  8. JavaScript 基础(三) - Date对象,RegExp对象,Math对象,Window 对象,History 对象,Location 对象,DOM 节点...
  9. Linux_CentOS 7下Nginx服务器的安装配置
  10. 利用非循环顺序队列采用广度搜索法求解迷宫问题(一条路径)