HTTP长连接服务器端推技术
服务器推送(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,这样浏览器在当前文档显示完毕后,以最快的速度载入新的数据!
相关文章:

从AI、加密货币到火星任务,一种更强大、更稳定的存储设备
作者:贺佳来源:数据实战派所研究器件之一的显微镜图像,由两个尺寸相同的十字架组成,其中一个具有 IrMn3 柱,第二个仅由 Pt 组成。(来源:西北大学和墨西拿大学)美国西北大学和意大利墨…

CSDN - 进程结束后new出的内存会回收吗?
http://blog.csdn.net/stanjiang2010/article/details/5386647 关键词:内存回收

服务器ldap认证配置
1、yum -y install openldap-clients nss-pam-ldapd openldap 2、vim /etc/openldap/ldap.conf进入此配置文件添加如下2行 URI ldap://ldap.shuyun.com:389 BASE dcshuyun,dccom 3、配置自动创建家目录 authconfig --enableldap --enableldapauth --enablemkhomedir --…

使用 .NET 实现 Ajax 长连接
作者:http://www.cnblogs.com/cathsfz/Ajax的长连接,或者有些人所说的Comet,就是指以XMLHttpRequest的方式连接服务器,连接后服务器并非即时写入相应并返回。服务器会保持连接并等待一个需要通知客户端的事件,该事件发…

全员编程时代,人类高质量程序员应具备哪三大特质?
在美国公布的《新兴科技趋势报告》里,2045年,最保守预测也认为将会有超过1千亿的设备连接在互联网上,这些设备包括了移动设备、可穿戴设备、家用电器、医疗设备、工业探测器、监控摄像头、汽车,以及服装等。不久的将来,…

[Linux] ubuntu 格式化u盘
$sudo fdisks -l 基本功,格式化命令,以格式化 /dev/sdb4 分区为例: $ sudo umount /dev/sdb4 # 必须先卸载该分区 # 格式化为 FAT 分区 $ sudo mkfs.vfat -F 32 /dev/sdb4 # -F 参数必须大写,参数有 12,16 和…

搭建Mantis 缺陷管理系统(转)
转自 什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written in the PHP scripting language and works with MySQL, MS SQL, and PostgreSQL databases and a webserver. MantisBT has been installed on Windows, Linux, Mac…

Http环境下的保持连接方式
Http环境本身是一种无连接状态的架构,在这种架构下服务器只能是被动的接受客户端的请求,返回结果,而无法主动的给客户端发送数据。而在很多需要实时数据交互(比如Web IM)的场景中,我们却希望能及时得到服务器给我们返回…

22岁专访库克、B站3天涨粉百万,他将毕设树莓派扫描仪升级,繁星散落在校空!...
整理 | 禾木木出品 | AI科技大本营(ID:rgznai100)近日,#何同学毕业#冲上了热搜,4 亿网友阅读词条,1.7 万讨论为他送上毕业祝福,最新毕业视频燃爆朋友圈。过去几个月,要说B站网友苦苦等待的UP主是…

Database Appliance并非Mini版的Exadata-还原真实的Oracle Unbreakable Database Appliance
Oracle甲骨文系统有限公司在北京时间9月23日发布了一款Oracle数据库机即Oracle Database Appliance。Oracle Database Appliance是一款面向中小型企业的使用简单、用得起的高可用数据库专用服务器,该数据库机基于Sun Fire服务器、Oracle Enterprise Linux和Oracle D…

一款基于jquery和css3的响应式二级导航菜单
今天给大家分享一款基于jquery和css3的响应式二级导航菜单,这款导航是传统的基于顶部,鼠标经过的时候显示二级导航,还采用了当前流行的响应式设计。效果图如下: 在线预览 源码下载 实现的代码。 html代码: <div i…

基于PyTorch,如何构建一个简单的神经网络
本文为 PyTorch 官方教程中:如何构建神经网络。基于 PyTorch 专门构建神经网络的子模块 torch.nn 构建一个简单的神经网络。完整教程运行 codelab→https://openbayes.com/console/open-tutorials/containers/OgcYkLjKw89torch.nn 文档→https://pytorch.org/docs/s…

C#语言的几个层次
作者: 李建忠 接到一位前不久C#培训学员的来信,这位学员虽然以前功底欠缺,但学习劲头很足,在培训中成长很快。即便基本吃透《.NET框架(修订版)》还嫌不够过瘾,一心要成为高手中的高手。来信的目…

确定安全威胁与漏洞-A
1、社会工程学攻击是一种使用欺骗和诡计说服不知情的用户提供敏感信息或做出违背安全准则行为的攻击类型。通常通过人、电子邮件、电话等方式表现出来。 2、社会工程学攻击类型主要有电子欺骗、冒名顶替、骗局、网络钓鱼、电话钓鱼、大型网络钓鱼(鱼叉式网络钓鱼&am…

C# 特性(Attribute)学习。
特性(attribute)是被指定给某一声明的一则附加的声明性信息。 在C#中,有一个小的预定义特性集合。在学习如何建立我们自己的定制特性(custom attributes)之前,我们先来看看在我们的代码中如何使用预定义特性…

JMeter学习(二十三)关联
话说LoadRunner有的一些功能,比如:参数化、检查点、集合点、关联,Jmeter也都有这些功能,只是功能可能稍弱一些,今天就关联来讲解一下。 JMeter的关联方法有两种:后置处理器-正则表达式提取器与X…

程序员千万不要选全栈开发
作者 | 千鸟(网名) 小路助手开发者责编 | 晋兆雨出品 | CSDN(ID:CSDNnews)对于大多数人来说,大学毕业后选择一家满意的公司,一路升职加薪才是正解,但他却偏偏选择了一条鲜有人知的…

手动初始化设置3PAR存储系统
准备工作 1. 具备串口的终端电脑(USB to serial). 2. 使用标记为“180-055”灰色适配器(3par自带). 3. 标准RJ45网线. 4. 下载HP 3par OS及SP Patch包. 5. PuTTY软件(或其他串口软件) 其他说明 手动设置存储系统…

C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名。
得到函数名: System.Diagnostics.StackTrace st new System.Diagnostics.StackTrace(); this.Text st.GetFrame(0).ToString(); 得到代码行,源代码文件名: StackTrace st new StackTrace(new StackFrame(true));Consol…

特斯拉Model 3国内起售价下调至23.59万元
7月30日11:00,特斯拉官方微博宣布,即日起,特斯拉Model 3标准续航升级版的价格下调15000元人民币,调整后的价格为235900元人民币(此为补贴后起售价)。此次价格调整反映了成本波动的实际情况。特斯拉一直秉承…

Maven内置变量
1、Maven内置变量说明: ${basedir} 项目根目录${project.build.directory} 构建目录,缺省为target${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes${project.build.finalName} 产出物名称,缺省为${proje…

在客户端调用MOSS的搜索服务,实现更加灵活的搜索控制
MOSS中提供了很多web services的服务,都放在http://<Site>/_vti_bin下 我们可以在其他地方,比如winForm,webForm中调用,对MOSS的对象进行灵活操作。 下面我简单列一下调用一个MOSS中的搜索服务的方法: 1、在VS…

年收入百万美元AI科学家的烦恼与思考
AI 研究科学家 Alexis Conneau 只需敲击了几下键盘,包含数千亿字的信息洪流,就能在他的电脑屏幕窗口中滚动起来。多年来,自动化 “爬虫” 用 100 种语言将互联网中的古老诗歌、愤怒的评论、甜点食谱和其他一切信息吸进庞大的数据库中。作为人…

web架构设计经验分享
本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,…

BOM和DOM的区别
为什么80%的码农都做不了架构师?>>> BOM 浏览器对象模型提 供了独立于内容而与浏览器窗口进行交互的对象。描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏 中的…

C#编码简单性之语义篇(如何编写简短的C#代码,随时更新)
以前写C的时候曾经在自己网站上发表过一个编码“简单性”之文章,现在编写C#了才发现自己无意之间就会写下一些浪费屏幕的代码。下面是自己编码中偶然发现的一些案例,欢迎中等水平的编程者参考。因为要积累案例,所以随时更新。---------------…

网站性能越来越差怎么办?
新的一年,你的老板或客户,是否曾和你抱怨公司的网站性能愈来愈差?网站大家都会写,自从有了 Visual Studio 之后,连你家楼下的正妹小喵和隔壁的王大婶都会写 ASP.NET。但同样的一个画面,背后的性能却可能是天…

如何设计一个高性能CPU?
任何一种技术都会经历从阳春白雪到下里巴人的过程,就像我们对计算机的理解从“戴着鞋套才能进的机房”变成了随处可见的智能手机。在前面20年中,大数据技术也经历了这样的过程,从曾经高高在上的 “火箭科技(rocket science&#x…

Python包管理工具Distribute的安装
Python包管理工具Distribute的安装Python的包管理工具常见的有easy_install, setuptools, 还有pip, distribute,那麽这几个工具有什么关系呢,看一下下面这个图就明白了:可以看到distribute是setuptools的替代方案,pip是easy_insta…

如何用 Graylog 管理日志?- 每天5分钟玩转 Docker 容器技术(93)
上一节已经部署好了 Graylog,现在学习如何用它来管理日志。 首先启动测试容器。 docker run -d \ --log-drivergelf \ --log-opt gelf-addressudp://localhost:12201 \ --log-opt tag"log-test-container-A" \ b…