在Ajax应用程序中实现实时数据推送

这种技术可能会生成大量不必要的流量和非最优化的应用程序。幸运的是,某些富 Internet 应用程序(RIA)技术确实允许打开专用套接字通道,由后端服务器为 Asynchronous JavaScript and XML (Ajax) 应用程序提供进入其 API 并实现服务器推送的机会。这篇文章以多种方式探讨了这项技术,帮助您充分理解,以便着手开始进行自己的实现工作。

简介

Ajax 技术已经存在了一段时间,开发的动力已经真正开始得到了人们的认可。越来越多的 Web 站点正在考虑使用 Ajax 进行设计,开发人员也开始将 Ajax 的能力发挥到极限。随着社交网络和协作式报告等现象的出现,一组全新的要求浮现出来。如果有其他用户更改了某位用户正在观察的任何活动,则用户希望得到通知。如果一个 Web 站点显示动态数据,如股价等,那么所有用户都必须立即得到关于变更的通知。

这些场景本身属于一类称为 “服务器推送” 的问题。通常,服务器是中心实体,服务器将首先获得关于所发生的任何更改的通知,服务器负责将此类更改通知所有连接的客户端。但遗憾的是,HTTP 是客户端-服务器通信的标准协议,它是无状态的,而且在某种意义上来说,也是一种单向的协议。HTTP 场景中的所有通信都必须由客户端发起,至服务器结束,然而我们所提到的场景的需求则完全相反。对于服务器推送来说,需要由服务器发起通信,并向客户端发送数据。HTTP 协议并无相关配置,Web 站点应用程序开发人员使用独创的方法来绕过这些问题,例如轮询,客户端会以固定(或可配置)的时间间隔与服务器联系,查找是否有新更新可用。在大多数时候,这些轮询纯粹是浪费,因而服务器没有任何更新。这种方法不是没有代价的,它有两大主要问题。

这种方法极度浪费网络资源。每一个轮询请求通常都会创建一个 TCP 套接字连接(除非 HTTP 1.1 将自己的 keepAlive 设置为 true,此时将使用之前创建的套接字)。套接字连接本身代价极高。除此之外,每一次请求都要在网络上传输一些数据,如果请求未在服务器上发现任何更新,那么这样的数据传输就是浪费资源。如果在客户端机器上还运行着其他应用程序,那么这些轮询会减少传输数据可用的带宽。

即便是请求成功,确实为客户端传回了更新,考虑到轮询的频率,这样的更新也不是实时的。例如,假设轮询配置为每 20 秒一次,就在一次请求刚刚从服务器返回时,发生了更新。那么这次更新将在 20 秒后的下一次请求到来时才能返回客户端。因而,服务器上准备好供客户端使用的更新必须等待一段时间,才能真正地为客户端所用。对于需要以尽可能实时的方式运行的应用程序来说,这样的等待是不可接受的。

考虑到这样两个问题,对于需要关键、实时的服务器端更新的企业应用程序而言,轮询并不是最理想的方法。在这篇文章中,我将介绍多种可以替代轮询的方法。每一种替代方法在某些场景中都有自己的突出之处。我将说明这些场景,并展示需要实时服务器推送的一组 UI。

Ajax 应用程序中的服务器更新技术

让我们来具体看看用于更新来自服务器的信息的一些常用技术,这些技术模拟了服务器推送。

短轮询

短轮询也称为高频轮询,就是我在本文开头处介绍的技术。这种方法在以下情况中表现最好:

有足够的带宽可用。

根据统计数据,大多数时候,请求都能获得更新。例如,股市数据就总是有可用更新。

使用 HTTP 1.1 协议。设置 keepAlive=true,因而,同一个套接字连接始终保持活动状态,并可重用。

长轮询

长轮询是用于更新服务器数据的另外一种方法。这种方法的理念就是客户端建立连接,服务器阻塞连接(通过使请求线程在某些条件下处于等待状态),有数据可用时,服务器将通过阻塞的连接发送数据,随后关闭连接。客户端在接收到更新后,立即重新建立连接,服务器重复上述过程,以此实现近于实时的通信。然而,长轮询具有以下缺陷:

一般的浏览器默认允许每台服务器具有两个连接。在这种情况下,一个连接始终是繁忙状态。因而,UI 只有一个连接(也就是说,能力减半)可用于为用户请求提供服务。这可能会导致某些操作的性能降低。

仍然需要打开和关闭 HTTP 连接,如果采用的是非持久连接模式(keepAlive=false),那么这种方法的代价可能极高。

这种方法近于实时,但并非真正的实时。(当然,某些外部因素总是不可控的,比如网络延时,在任何方法中都会存在这些因素。)

时间: 2024-09-19 08:17:01

在Ajax应用程序中实现实时数据推送的相关文章

如何从iFix中读取实时数据

问题描述 现在需要从iFix中读取实时数据,存到Hbase数据库中,程序是java写的,请问有人知道通过什么方式能读取到iFix中的实时数据? 解决方案

为什么c程序中创建了数据文件,再次打开源代码运行时数据没了?

问题描述 为什么c程序中创建了数据文件,再次打开源代码运行时数据没了? 为什么c程序中创建了数据文件,再次打开源代码运行时数据没了? http://blog.csdn.net/hackbuteer1/article/details/6573488# 就是这个通讯录的代码,在里面创建通讯录后,再次打开运行显示通讯录时就提示通讯录为空. 解决方案 写入文件是否错误,用winhex或者ultraedit看看写文件本身有没有写对. 如果没有,就是写的问题,如果对的,那么就是读的问题.再具体调试有问题的程

怎么将java程序中产生的数据保存为Excel文件

问题描述 怎么将java程序中产生的数据保存为Excel文件 在我的项目中其中产生了一些很重要的数据需要保存下来.在图像中的到的一些矩形框, 已知道矩形框的左上角坐标(x1,y1),右下角坐标(x2,y2):我想把这坐标的四个数据保存到Excel表中.第一列保存第几个矩形框,第2-5列保存相应的四个点的位置. 求java实现的代码.求大神!! 解决方案 你这就是一个excel存储 用jxl或者Poi操作 下面这个有图说明.http://www.cnblogs.com/mingforyou/arc

Worktile中百万级实时消息推送服务的实现

在团队协同工具 Worktile的使用过程中,你会发现无论是右上角的消息通知,还是在任务面板中拖动任务,还有用户的在线状态,都是实时刷新.Worktile中的推送服务是采用的是基于XMPP协议.Erlang语言实现的Ejabberd,并在其源码基础上,结合我们的业务,对源码作了修改以适配我们自身的需求.另外,基于AMQP协议也可以作为实时消息推送的一种选择,踢踢网就是采用 RabbitMQ+STOMP协议实现的消息推送服务.本文将结合我在Worktile和踢踢网的项目实践,介绍下消息推送服务的具

asp.net mvc实现简单的实时消息推送_实用技巧

因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket  Ajax的轮回.当然此处我们使用asp.net 中的SignalR类库.因为它可以实现网页上消息的实时推送.什么是实时推送呢,我简单的说一下我个人的理解吧.实时:在同一时间类发生的事情,当然在计算机中并不是绝对的实时,因为CPU在同一时间片只能处理一个任务,那么这个时候疑问又来了? 我们平时使用电脑又上网,又听音乐是如何

JavaScript数据推送Comet技术详解_javascript技巧

JavaScript数据推送主要致力于webapp的在线推送服务,不用我们每次都像服务器去发送Ajax请求而主动从Server端推送数据到本地. 数据推送进化史: 1. HTTP协议简易轮询,保持着一个链接不放,或者通过前端不停的向后端发送请求 2. H5更新后有了WebSocket大大改善了双向和单向推送数据的便利性 3. SSE(Server-Send Event):服务器推送数据的新方式  Comet:基于 HTTP 长连接的服务器推送技术 本课时介绍Comet:基于 HTTP 长连接的服

Node.js实现数据推送_node.js

场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的方式处理Ajax请求并返回数据,在学校的时候实验室的项目一直都采用轮询,因为它最保险也最容易实现.但轮询带来的通信资源的浪费是无法忽视的,无论数据是否改变,都照常发送请求并响应,而且每次HTTP请求都带有很长的头部信息. 2. Comet的概念是长连接,客户端发送请求后,后端将连接保持下来,直到连接超时

在 Asp.NET MVC 中使用 SignalR 实现推送功能

原文http://www.cnblogs.com/kesalin/archive/2012/11/09/signalr_push.html 在 Asp.NET MVC 中使用 SignalR 实现推送功能 罗朝辉 ( http://www.cnblogs.com/kesalin/ ) CC许可,转载请注明出处   一,简介 Signal 是微软支持的一个运行在 Dot NET 平台上的 html websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户

java web 客户端订阅 数据推送

问题描述 java web 客户端订阅 数据推送 推送数据是从第三方拿到的,怎么推给请求这些数据的web页面.注:我的程序和第三方数据源只保持一个连接,这个连接一直接受第三方推过来的数据:每个web页面可能请求的数据也不一样 解决方案 java web服务器推送数据到客户端(pushlet) 解决方案二: 你好,我的理解,推送数据最好是走数据缓存,定时刷新页面的取数比较好,而且每个页面数据也不一样,最好是存下来后再分类取 解决方案三: 想要建立实时web,推荐GoEasy的web实时推送,他们是