`
mcko
  • 浏览: 29835 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

服务器推送(Server Push) 客户端拉曳(Client Pull)

阅读更多

服务器推送(Server Push)

     

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

     

客户端拉曳(Client Pull)

 

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

 

      其实push 和 pull 这两种技术手段非常不同,但目的几乎一致,都是为了给最终用户方便的提供最新信息。

 

      在服务器推送技术中,HTTP 连接一直保持着,直到服务器知道自己已结束发送数据并发送一个结束信号,或者客户端中断连接。而在客户端拖曳技术中,并不保持HTTP连接,相反,客户端被告知合时建立新连接,以及建立连接是获取什么数据。在服务器推送中,奇妙之处在于“multipart/mixed”格式的MIME,它能够使一个报文(或HTTP响应)包含许多数据项、在客户端拖曳中,奇妙之处在于HTTP响应头标(或等效的HTML元素),它能告知客户端在指定的延时时间后执行何种动作。

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

      客户端拖曳效率低,因为这必须每次为传送数据建立新的连接。但是它不必始终保持连接。

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

      服务器推送相对客户端拖曳的另一点优势是,服务器推送相对比较容易控制。例如,服务器每一次推送时都保持一个连接,但它又随时可以关闭其中的任何连 接,而不需要在服务器上设置特殊的算法。而客户端拖曳在同样的情况下要麻烦许多,它每次要与服务器建立连接,服务器为了处理将客户端拖曳请求与特定的最终 用户匹配等情况,需要使用相当麻烦的算法。如果实现服务器推送的CGI程序是使用Shell脚本语言编写的,有时会存在一些问题。例如,客户端最终用户中断连接,Shell程序通常不能注意 到,这将使资源毫无用处的浪费掉,解决这一问题的办法是用Perl或者C来编写这类CGI程序,以使用户中断连接时能够结束运行。
      如上所述,在服务器推送中,多个响应中连接始终保持,使服务器可在任何时间发送更多的数据。一个明显的好处是服务器完全能够控制更新数据的时间和频率。另 外,这种方法效率高,因为始终保持连接。缺点是保持连接状态会浪费服务器端的资源。服务器推送还比较容易中断。

 

接下来就大概说说服务器推送技术


      服务器在响应请求时,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”后的两条短线(--)表示报文结束,后面没有数据。对于服务器推送,使用一个“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--
      使用这一技术的关键是,服务器并不是推送整个“multipart/x-mixed-replace”报文,而是每次发送后数据块。
       HTTP 连接始终保持,因而服务器可以按自己需要的速度和频率推送新数据,两个数据块之间浏览器仅需在当前窗口等候,用户甚至可以到其他窗口做别的事情,当服务器 需要发送新数据时,它只是源(ABC输入法没那个字*&^$#)传输管道发送数据块,客户端相应的窗口进行自我更新。

      在服务器推送技术中,“multipart/x-mixed-replace”类型的报文由唯一的边界线组成,这些边界线分割每个数据块。每个数据 块都有自己的头标,因而能够指定对象相关的内容类型和其他信息。由于“multipart/x-mixed-replace”的特性是每一新数据块取代前 一数据对象,因而浏览器中总是显示最新的数据对象。 “multipart/x-mixed-replace”报文没有结尾。也就是说,服务器 可以永远保持连接,并发送所需的数据。如果用户不再在浏览器窗口中显示数据流,或者浏览器到服务器间的连接中间(例如用户按“STOP”按钮),服务器的 推送才会中断。这是人们使用服务器推送的典型方式。当浏览器发现“Content-type”头标或到达头标结束处时,浏览器窗口中的前一个文档被清除,并开始显示下一个文档。发现下一个报文边界时,就认为当前数据块(文档)已经结束。

 

        总之,服务器推送的数据由一组头标(通常包括“Content-type”)、数据本身和分割符(报文边界)三部分组成。浏览器看到分割符时,它保持状态不变,直到下一个数据块到达。将以上概念进行用编程方法实现,就可以得到实际的服务器推送程序。例如,下面的Unix shell程序将使浏览器每5秒显示一次服务器上的进程列表:
#!/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
服务器推送的另一个优点是它可以针对单个内联图象进行。包括图象的文档可以由服务器定时或定周期进行更新。而实现这一点非常简单:只需使IMG元素的SRC属性指向推送一系列图象的URL即可。

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

客户端拖曳

       客户端拖曳的一个简单用法是使文档按固定周期自动重载。例如,考虑下面的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也支持客户端拖曳),它将每隔一秒将自己重载一次。
由于META元素实际是在HTML文档中模拟HTTP响应头标,所以它能够告知浏览器将自身信息当作HTTP响应使用。上例中的META标记相当于:
Refresh:1

       这样,实际上就是HTTP头标告知浏览器每一秒更新一次文档。如果需要延时是12秒,那么就是这样的指令:

<META HTTP-RQUIV="Refresh" CONTENT=12>
那么它等效于:
Refresh:12

      关于客户端的拖曳我也懒的继续写下去,关于怎么使客户端自动申请其他URL的数据话,请使用如下:
<META HTTP-EQUIV="Refresh" CONTENT="12;URL=http://icools.yeah.net/">
注意的是,此处的URL不能使用相对路径,必须全部指定。

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

分享到:
评论

相关推荐

    服务器推送技术Server Push详解

    传统的客户端请求模式(Client Pull)已无法满足这种需求,因此服务器推送技术(Server Push)应运而生。Server Push的核心思想是改变浏览器被动获取信息的方式,转而由服务器主动向客户端发送数据。 #### 二、Server...

    Server Push入门介绍

    与传统的客户端发起请求(Client Pull)的方式不同,Server Push 可以在无需客户端主动请求的情况下,将更新的数据实时推送给客户端。这种技术在很多场景下都非常有用,例如: - **监控系统**:当后台硬件状态(如...

    基于服务器推送技术建立在线交流平台的探讨与实现

    服务器推送技术(Server Pushing)的核心在于改变信息流动的方向,由传统的“拉”式(Pull)变为“推”式(Push),即服务器主动向客户端推送信息。这一技术的应用不仅提高了信息传递的效率和稳定性,还能更好地支持...

    见证Android消息推送时刻

    在Android系统中,消息推送通常分为两种方式:客户端拉取(Pull)和服务器推送(Push)。拉取模式下,应用需定期向服务器请求新消息,但这种方式能耗较高且难以实现即时性。相比之下,服务器推送则更高效,它通过...

    基于短信网关WAP推送的实现(1).pdf

    WAP推送(WAP PUSH)技术是无线应用协议(Wireless Application Protocol)中的一种服务方式,它打破了传统互联网上“拉”(PULL)模式的信息获取方式,转而采用“推”(PUSH)的方式,即由服务器主动将信息推送给...

    PHP聊天室技术.pdf

    Server Push是由服务器将数据以多重MIME编码推送给用户端,而Client Pull则是用户从服务器拉取所需的数据。Client Pull是最常用的方法,利用HTML语言的Meta标签http-equiv="Refresh"的属性,每隔一段时间就检查...

    tcp文件传输软件设计(word文档良心出品).doc

    Pull 模式是指客户端主动从服务器端拉取文件,而 Push 模式是指服务器端主动将文件推送给客户端。 TCP 文件传输软件设计需要考虑到 TCP 协议的工作原理和特性、套接字编程机制和方法、C/S 架构和 Pull/Push 两种...

    SQL Server CE中RDA与Replication的研究.pdf

    同时,RDA也支持数据的推(Push)过程,即允许本地数据库的数据变更被推送到中央SQL Server数据库进行更新。 Replication技术要求后端数据库必须是SQL Server 2000版本或更高版本。它支持数据在多个数据库之间的...

    Python库 | prometheus_client_model-0.0.1-py2.7.egg

    - **Push vs Pull模型**: Prometheus采用Pull模型,定期从目标服务器上拉取度量数据,而不是由目标服务器主动推送。 2. **使用prometheus_client_model**: - **初始化Exporter**: 首先,你需要导入`prometheus_...

    用PHP实现Web页面无闪动刷新.pdf

    Web页面刷新通常有两种技术:Client Pull(客户端拉取)和Server Push(服务器推送)。在Client Pull模式下,用户浏览器发起请求,Web服务器处理后返回结果。然而,在Server Push模式下,服务器需要主动向浏览器发送...

    git客户端|Git window64位客户端

    7. 推送更改:`git push`将本地提交推送到远程仓库。 8. 拉取更新:`git pull`将远程仓库的更新合并到本地。 此外,Git客户端还通常包含图形化界面工具,如SourceTree、GitKraken等,它们简化了这些操作,提供拖放...

    [罗振辉]Window Mobile RDA数据库操作解决方案研究

    2. Push:将本地已更改的记录推送到原始远程SQL Server表。 3. SubmitSQL:执行SQL语句,直接在远程SQL Server上操作。 在实施RDA时,需要注意的是,使用Push方法之前,需要通过Pull方法设置跟踪选项。此外,...

    C#调用adb传输和推送数据到安卓设备上

    本篇我们将深入探讨如何利用C#调用ADB来实现数据的传输和推送至安卓设备。 首先,了解ADB的基本功能是必要的。ADB主要负责连接开发者电脑和安卓设备,提供设备管理、日志收集、安装应用、数据传输等能力。在C#环境...

    Python库 | git-client-0.1.5.tar.gz

    如果需要将本地更改推送到远程仓库,`git_client.Git.push(branch)`即可完成这一任务,`branch`参数是你要推送的分支名称。 此外,"git_client"库还支持更复杂的Git操作。例如,可以使用`git_client.Git.pull()`来...

    rocketmq-client-cpp-master.zip

    定时拉取由消费者定时发起请求,而基于消息通知的拉取则是在有新消息到达时,服务器主动推送。 5. **事务消息**:RocketMQ 提供了事务消息支持,保证消息在分布式事务中的原子性。生产者发送半消息,然后执行本地...

    C#调用adb传输和推送数据到安卓设备上.zip

    例如,`"adb push C:\\local\\file.txt /sdcard/remote/file.txt"`将本地的`file.txt`推送到设备的`/sdcard/remote/`目录下。在C#中,可以创建一个`Process`实例,设置`StartInfo.FileName`为adb路径,`StartInfo....

    SyncML技术文档

    - **服务器单向同步(Server push)**:仅服务器向客户端推送数据。 - **客户端刷新同步(Client refresh)**:客户端清除本地数据并重新同步。 - **服务器刷新同步(Server refresh)**:服务器清除所有客户端的记录,...

    StreamDemo.rar

    7. **推送和拉取模型**:视频直播有两种主要的传输模式,即服务器推送(Server-Side Push)和客户端拉取(Client-Side Pull)。前者由服务器主动发送数据,后者由客户端定期请求数据。选择哪种模式取决于应用场景和...

Global site tag (gtag.js) - Google Analytics