Webserver推送技术

server推送(Server Push)

推送技术的基础思想是将浏览器主动查询信息改为server主动发送信息。server发送一批数据,浏览器显示这些数据,同一时候保证与server的连接。当server须要再次发送一批数据时,浏览器显示数据并保持连接。以后,server仍然能够发送批量数据,浏览器继续显示数据,依次类推。

client拉曳(Client Pull)

在client拖曳技术中,server发送一批数据,在HTTP响应或文档头标记中插入指令,让浏览器“在5秒内再次装入这些数据”或“10秒内前往某URL装入数据”。当指定的时间达到时,client就依照server的指示去做,或者刷新当前数据,或者调入新的数据。

事实上push 和 pull
这两种技术手段很不同,但目的差点儿一致,都是为了给终于用户方便的提供最新信息。

在server推送技术中,HTTP
连接一直保持着,直到server知道自己已结束发送数据并发送一个结束信号,或者client中断连接。而在client拖曳技术中,并不保持HTTP连接,相反,client被告知合时建立新连接,以及建立连接是获取什么数据。

在server推送中,奇异之处在于“multipart/mixed”格式的MIME,它可以使一个报文(或HTTP响应)包括很多数据项、在client拖曳中,奇异之处在于HTTP响应头标(或等效的HTML元素),它能告知client在指定的延时时间后运行何种动作。

server推送通常效率要比client拖曳效率高,由于它不必为兴许数据建立新的连接。由于始终保持连接,即使没有传输数据时也是这样,因此server必须愿意分配这些TCP/IPport,对于TCP/IPport数有限的server这将是一个严重的问题。

client拖曳效率低,由于这必须每次为传送数据建立新的连接。可是它不必始终保持连接。

在实际情况中,建立HTTP连接通常须要花费相当多的时间,多达一秒甚至很多其它。因此从性能上考虑,server推送对于终于用户更有吸引力,特别是对于须要常常更新信息的情况下。

server推送相对client拖曳的还有一点优势是,server推送相对照较easy控制。比如,server每一次推送时都保持一个连接,但它又随时能够关闭当中的不论什么连接,而不须要在server上设置特殊的算法。而client拖曳在相同的情况下要麻烦很多,它每次要与server建立连接,server为了处理将client拖曳请求与特定的终于用户匹配等情况,须要使用相当麻烦的算法。

假设实现server推送的CGI程序是使用Shell脚本语言编写的,有时会存在一些问题。比如,client终于用户中断连接,Shell程序通常不能注意到,这将使资源毫无用处的浪费掉,解决这一问题的办法是用Perl或者C来编写这类CGI程序,以使用户中断连接时可以结束执行。

     
如上所述,在server推送中,多个响应中连接始终保持,使server可在不论什么时间发送很多其它的数据。一个明显的优点是server全然可以控制更新数据的时间和频率。另外,这样的方法效率高,由于始终保持连接。缺点是保持连接状态会浪费server端的资源。server推送还比較easy中断。

接下来就大概说说server推送技术 
     
server在响应请求时,HTTP使用MIME报文格式来封装数据。通常一个HTTP响应仅仅能包括一个数据块。但MIME有一种机制可用一个报文(或HTTP响应)表示将多个数据块,这样的机制就是成为“multipart/mixed”的标准MIME类型。multipart/mixed报文大体格式例如以下: 

Content-type:multipart/mixed;boundary=ThisRandomString 

--ThisRandomString 
Content-type:text/plain 
第一个对象的数据。 

--ThisRandomString 
Content-type:text/plain 
第二个对象的数据。 

--ThisRandomString--

上述报文包含两上数据块,二者的类型都是“text/plain”。最后一个“ThisRandomString”后的两条短线(--)表示报文结束,后面没有数据。

对于server推送,使用一个“multipart/mixed”类型的变种--multipart/x-mixed-replace。这里,“x-”表示属于实验类型。“replace”表示每个新数据块都会取代前一个数据块。也就是说,新数据不是附加到旧数据之后,而是替代它。

以下是实际使用的“multipart/x-mixed-replace”类型: 

Content-type:multipart/x-mixed-replace;boundary=ThisRandomString 

--ThisRandomString 
Content-type:text/plain 
第一个对象的数据 

--ThisRandomString 
Content-type:text/plain 

第二个(最后一个)对象的数据。 
--ThisRandomString-- 

     
使用这一技术的关键是,server并非推送整个“multipart/x-mixed-replace”报文,而是每次发送后数据块。 

HTTP连接始终保持,因而server能够按自己须要的速度和频率推送新数据,两个数据块之间浏览器仅需在当前窗体等候,用户甚至能够到其它窗体做别的事情,当server须要发送新数据时,它仅仅是源(ABC输入法没那个字*&^$#)传输管道发送数据块,client对应的窗体进行自我更新。

在server推送技术中,“multipart/x-mixed-replace”类型的报文由唯一的边界线组成,这些边界线切割每一个数据块。每一个数据块都有自己的头标,因而可以指定对象相关的内容类型和其它信息。因为“multipart/x-mixed-replace”的特性是每一新数据块代替前一数据对象,因而浏览器中总是显示最新的数据对象。 

“multipart/x-mixed-replace”报文没有结尾。也就是说,server能够永远保持连接,并发送所需的数据。假设用户不再在浏览器窗体中显示数据流,或者浏览器到server间的连接中间(比如用户按“STOP”button),server的推送才会中断。这是人们使用server推送的典型方式。

当浏览器发现“Content-type”头标或到达头标结束处时,浏览器窗体中的前一个文档被清除,并開始显示下一个文档。发现下一个报文边界时,就觉得当前数据块(文档)已经结束。 

总之,server推送的数据由一组头标(通常包含“Content-type”)、数据本身和切割符(报文边界)三部分组成。浏览器看到切割符时,它保持状态不变,直到下一个数据块到达。

将以上概念进行用编程方法实现,就能够得到实际的server推送程序。比如,以下的Unix
shell程序将使浏览器每5秒显示一次server上的进程列表: 
#!/bin/sh 
echo "HTTP/1.1
200" 
echo "Content-type:
multipart/x-mixed-replace;boundary=--ThisRandomString--" 
echo
"" 
echo "--ThisRandomString--" 
while true 

do 
echo "Content-type: text/html" 
echo "" 
echo
"h2Processes on this machine updated every 5 seconds/h2" 
echo
"time:" 
date 
echo "p" 
echo "plaintext" 
ps
-el 
echo "--ThisRandomString--" 
sleep 5 

done 
     
注意到,边界设置在sleep语句之前发送,这可以确保浏览器清除其缓冲区,并显示所接收到的最新数据。 
NCSA
HTTPD用户在内容类型中不能使用空格,包含边界參数。NCSA
HTTPD仅仅能将不带空格字符的字符串作为内容类型。假设在内容类型行中存在空格(冒号后面的空格除外),空格后的不论什么文本都会被删除。 

以下的演示样例是正确的: 
Content-type:
multipart/x-mixed-replace;boundary=ThisRandomString 

       而下例则不能正常工作,由于它在中间有空格: 

Content-type: multipart/x-mixed-replace; boundary=ThisRandomString 

server推送的还有一个长处是它能够针对单个内联图象进行。包含图象的文档能够由server定时或定周期进行更新。而实现这一点很easy:仅仅需使IMG元素的SRC属性指向推送一系列图象的URL就可以。

如果server推送用于单个内联图象,文档中的图象就会一次次被新推送来的图象所取代,而文档本身不需变化(如果文档没有进行server推送)。这样,WEB页面中有限的动画就能够为静态画面所取代。

client拖曳

client拖曳的一个简单使用方法是使文档按固定周期自己主动重载。比如,考虑以下的HTML文档: 
<META
HTTP-EQUIV="Refresh" CONTENT=1> 
< TITLE>Document
ONE</TITLE> 
< H1>This is Document ONE!</H1> 

Here‘s some text.<P> 
      
假设将它加载支持动态文档的浏览器(Netscape 1.1以上,Internet
Explorer和Mosaic也支持client拖曳),它将每隔一秒将自己重载一次。 

因为META元素实际是在HTML文档中模拟HTTP响应头标,所以它可以告知浏览器将自身信息当作HTTP响应使用。上例中的META标记相当于: 

Refresh:1 
      
这样,实际上就是HTTP头标告知浏览器每一秒更新一次文档。假设须要延时是12秒,那么就是这种指令: 
<META
HTTP-RQUIV="Refresh" CONTENT=12> 
那么它等效于: 
Refresh:12

关于client的拖曳我也懒的继续写下去,关于怎么使client自己主动申请其它URL的数据话,请使用例如以下: 
<META
HTTP-EQUIV="Refresh" CONTENT="12;URL=http://icools.yeah.net/"> 

注意的是,此处的URL不能使用相对路径,必须所有指定。

当中时间间隔能够设置为0,这样浏览器在当前文档显示完成后,以最快的速度加载新的数据!

Webserver推送技术,布布扣,bubuko.com

时间: 2024-12-25 13:46:31

Webserver推送技术的相关文章

Web端服务器推送技术原理分析

1 背景 "服务器推送技术"(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继"Ajax"之后又一个倍受追捧的Web技术."服务器推送技术"最近的流行跟"Ajax "有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失.

Web端服务器推送技术原理分析及dwr框架简单的使用

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系

Web端服务器推送技术原理分析及dwr框架简单的使用 转载

1 背景 “服务器推送技术”(ServerPushing)是最近Web技术中最热门的一个流行术语.它是继“Ajax”之后又一个倍受追捧的Web技术.“服务器推送技术”最近的流行跟“Ajax ”有着密切的关系. 随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大.Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失. 但是,在浏览器中的 Ajax应用中存在一个致命的缺陷无法满足传统桌面系

物联网核心协议—消息推送技术演进

消息触达能力是物联网(internet ofthings, IOT)的重要支撑,而物联网很多技术都源于移动互联网.本文阐述移动互联网消息推送技术在物联网中的应用和演进. 一.物联网架构和关键技术 从开发的角度,无线接入是物联网设备端的核心技术,身份设备管理和消息推送技术是物联网云端的核心技术.而从场景体验的角度,除了前者,还要包括手机的前端开发技术. 在上一篇<一张图读懂基于微信硬件平台的物联网架构>博文中,笔者曾用一张大图详细描述了基于微信硬件平台的物联网架构的组成要素.关键场景.和通信协议

Python web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

C(++) web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

node.js web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

Websocket web实时消息服务器后台推送技术方案---GoEasy

Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送速度快,代码简单易懂上手快浏览器兼容性:GoEasy推送支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等.支 持不同的开发语言:   GoEasy推送提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过RestfulAPI来实现后台实时推送.

ASP.NET Web实时消息后台服务器推送技术---GoEasy

越来越多的项目需要用到实时消息的推送与接收,怎样用ASP.NET现最方便呢?我这里推荐大家使用GoEasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送! 浏览器兼容性:GoEasy推送 支持websocket 和polling两种连接方式,从而可以支持IE6及其以上的所有版本,同时还支持其它浏览器诸如Firefox, Chrome, Safari 等等. 支持不同的开发语言:    GoEasy推送 提供了Restful API接口,无论你的后台程序用的是哪种语言都可以通过