目前,基于HTTP的实时信息传输技术主要有客户端定时器的同步刷新、基于AJAX的异步传输和服务端Push这3种方法。下面分别进行介绍:
1.客户端定时器的同步刷新
这种技术是在客户端设置定时器,每隔一段时间客户端向服务器提出一个HTTP连接请求。服务器收到请求后,将所有的数据(包括传输过的数据和未传输的数据)一股脑儿发送给客户端,客户端浏览器以同步方式重绘这个页面,以达到对这个Web页面刷新的功能。
2. 基于AJAX的异步刷新
AJAX通过XMLHttpRequest对象来发送异步请求,XMLHttpRequest是AJAX的核心对象,其主要方法有:
open():建立到服务器的新请求
send():向服务器发送请求
abort():退出当前请求
readyState:提供当前HTML的就绪状态
responseText:服务器返回的文本格式的请求响应
responseXML:服务器返回的XML格式的请求响应
客户端使用JavaScript脚本语言,通过DOM获取请求参数的信息,并使用XMLHttpRequest对象来和服务器进行异步通信,服务器处理请求后,返回给客户端普通的文本或XML,客户端浏览器使用JavaScript处理文本或解析XML,并通过DOM更新相关的页面UI。
3. 服务器端Push技术
服务器端Push技术是基于HTTP长连接的一种同步模式。在客户端和服务器端通信完成后,不会马上断开相关的HTTP连接,而是调用Thread.sleep()方法使相关服务器端线程休眠,从而保持原有的HTTP连接,这样,服务器端和客户端始终有一条建立好的通信管道。需要时,服务器端可以唤醒相关的线程,通过原先建立的HTTP连接向客户端发送实时信息。总之,就是通过客户端浏览器保持一个长时间活动的HTTP连接,来实现服务器与浏览器的快速数据交互。
在传统的web世界中,服务器永远是被动地发送数据,前提是客户端必须先发起请求。
传统的web应用模型称为三层结构。客户端向web服务器发送HTTP请求,web服务器接收这个请求,根据不同情况访问相应的数据库、web service或者其他业务系统,经过业务逻辑计算,向客户端浏览器发送HTML响应。
现在的服务器推送技术是保证原有的HTTP协议不变,在服务器端改变处理方式,使得服务器能够使用浏览器已经打开的HTTP连接,主动向浏览器发送消息。Alex Russell称这种基于HTTP长连接、无须在浏览器端安装插件、事件驱动的服务器推送技术为“Comet”。
Comet有时也称为反向AJAX或服务器推送技术(Server-side Push)。其基本思想是:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据。这咋听起来很简单,但如果熟悉Web应用程序,尤其是HTTP协议的话,我们就知道,这绝不简单。因为实现Comet风格的Web应用,必须同时保证在浏览器和服务器上的可伸缩性,这只是最近几年才成为可能的。目前一些主流网站应用了类似的原理,像WebQQ、开心网、白社会等等,它们中的动态消息都是采用类似的技术,可能具体实现方式不一样。
AJAX应用程序可以使用三种基本的方法来实现服务器推送技术:
1)浏览器每隔一段时间向服务器发出轮询(poll)以进行更新。
2)服务器始终打开与浏览器的连接并在数据可用时发送给浏览器,称为基于长轮询方式的Comet模型。该模型与传统的AJAX应用不同点在于:服务器端会阻塞请求直到有数据传递或超时才返回,即维持长连接;客户端响应处理程序会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
3)基于HTTP streaming的AJAX实现的Comet模型。该方式与基于长连接的Comet不同之处在于:HTTP streming重复使用同一个连接,而且永远不关闭这个连接,即服务器与浏览器之间的TCP连接会一直保持,直到其中一方发送了一条明显的“关闭连接”的信息,或者有超时以及网络错误发生。
HTTP 1.1规范中规定,客户端与服务器端建立超过两个的HTTP连接时,新的连接会被阻塞。这说明如果AJAX应用程序打开了两个长连接,任何新的HTTP请求会被前两个长连接阻塞掉,从而无法到达服务器。因此,当采用基于长连接的服务器推送技术时,应该只有一个连接使用那样的技术而确保还有另外一个连接用来接收其他的请求。