服务器推送(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,这样浏览器在当前文档显示完毕后,以最快的速度载入新的数据!

转载于:https://blog.51cto.com/2122875/835764

服务器推送/客服端拉扯相关推荐

  1. jpush java api_JPush極光推送Java服務器端API

    產品功能說明 極光推送(JPush)是一個端到端的推送服務,使得服務器端消息能夠及時地推送到終端用戶手機上,讓開發者積極地保持與用戶的連接,從而提高用戶活躍度.提高應用的留存率.極光推送客戶端支持 A ...

  2. 基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流

    基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流 实现效果 引库 推流流程 代码实现 初始化 createPeerConnectionFac ...

  3. 客服端与服务器之间传输信息,QT实现客服端和服务器之间消息和文件交互

    QT实现客服端和服务器之间消息和文件交互 文章目录 QT实现客服端和服务器之间消息和文件交互 平台环境 数据库选择与安装 交叉编译工具链GCC的安装 数据库创建数据 Qt的开发环境搭建 Web实现 T ...

  4. 常见的几种服务器/客服端模型

    其实常见的几种服务器/客服端模型都可以,用餐厅,服务员,客人来解释. 餐厅:代表服务器 顾客:代表客服端 服务员:代表处理客人请求的事件 菜单:菜单方便顾客了解菜品和价格,客人读了菜单,然后点菜,相当 ...

  5. (复习)android 调用系统相机 图库 裁剪-图片上传-客服端-服务器

    引用转载http://www.cnblogs.com/eyu8874521/archive/2012/07/20/2600697.html 效果: 客服端代码: package com.cn.lxz. ...

  6. SVN 服务器和客服端搭建

    SVN 服务器和客服端搭建 一.SVN 服务器和客服端搭建 二.SVN服务端的安装步骤 三.SVN客户端的安装 四.使用SVN上传以及共享工程文件等 资料来源 来源CSDN博主「liuxiaofan_ ...

  7. Java——实现客服端和服务器计算

    这次看到以前对Socket网络编程有点弱,看完一些资料.各位网友对网络编程的相关学习, 接下来我来展示一个简单的Socket网络编程--客服端向服务器发送计算表达式及服务器发送计算结果. 客服端与服务 ...

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

    转载:http://blog.csdn.net/shimiso/article/details/8151362 1 背景 "服务器推送技术"(ServerPushing)是最近We ...

  9. OPPO消息推送服务器,OPPO推送平台服务端API.PDF

    OPPO推送平台服务端API.PDF OPPO推送平台服务端API 修订记录: 版本号 修订人 修订日期 修订描述 V0.1 宫建涛 2017-03-28 初始版本 V0.2 宫建涛 2017-07- ...

最新文章

  1. DFT-软件篇 from 陈新武
  2. leetcode算法题--二叉搜索树的最近公共祖先
  3. AO安装需要Microsoft Visual Studio 2013?
  4. Oracle业务适合用PostgreSQL去O的一些评判标准
  5. linux cp 强制覆盖
  6. CodeForces - 1521D Nastia Plays with a Tree(树上最小路径覆盖)
  7. hystrix应用 博客_使用Hystrix DSL创建弹性骆驼应用程序
  8. Delphi:第一个hello world程序
  9. latex转为html效果好吗,latex转HTML
  10. 选择阿里云数据库HBase版十大理由
  11. 西数推出首款SanDisk驱动器:蓝盘和绿盘
  12. 域名解析CNAME和MX记录 冲突 解决办法
  13. word打印“错误!未找到引用源”的解决办法
  14. 在多个指定区间内生成随机数,且随机数总和固定算法
  15. 与门、或门、非门、与非门、或非门、异或门、同或门
  16. YL工作记录 (不断更新) -- 2020.04
  17. 机器学习--波澜壮阔四十年
  18. 轮廓检测和边缘检测区别
  19. 162页官方PPT,详述西门子TIA Portal V17
  20. Win7系统故障处理小技巧六则

热门文章

  1. 三千字教你使用MOT
  2. idea2021断点调试,服务启动特别慢如何解决
  3. 如何批量查询多个众邮快递单号的物流情况
  4. Ada语言-标识符和注释
  5. 彩虹显IP QQ动了谁的奶酪?
  6. 计算机关闭系统剪切板上的内容,怎样删除电脑粘贴板上的内容?三个方法教你清空剪切板...
  7. 旋转 翻转_旋转跳跃我闭着眼……1.8吨货车突然腾空翻转!监控拍下不可思议瞬间...
  8. (二)springboot整合之knife4j(详细)
  9. linux查看逻辑卷lvlg,Linux LVM逻辑卷
  10. CSDN代码内容复制后在程序中格式报错处理方法