搞懂什么是”服务器推送”,长连接,长轮询,Comet,htmlfile

Comet:基于纯浏览器的“服务器推”技术开始受到较多关注,Alex Russell(Dojo Toolkit 的项目 Lead)称这种基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。目前已经出现了一些成熟的 Comet 应用以及各种开源框架;一些 Web 服务器如 Jetty 也在为支持大量并发的长连接进行了很多改进。

 

1.实例参考java实现
  https://blog.csdn.net/xxd851116/article/details/10022015

服务器端:
  用for循环保持连接
  用response.flushBuffer() 向客户端返回(缓存)数据(示例中返回javascript,客服端收到收到就会执行,实现了互动)
  (php的话使用ob_flush()和flush() )

客户端:
  用iframe来接受到服务器的响应,这样子就不影响客户端的操作

   IE里用htmlfile来实现。
   与直接来个隐藏iframe读一个长连接相比这种做法在功能没区别
   其主要的好处是这么新建一个htmlfile再把iframe写到里面,建立一个长连接时
    IE就不会在下面的状态栏一直显示 "正在打开XXXXXXXXXXXXXXXX页面" 
  htmlfile实现参考https://www.cnblogs.com/my_life/articles/2749709.html

使用 iframe 请求一个长连接有一个很明显的不足之处:IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法用到了 gmail+gtalk 产品中。Alex Russell 在 “What else is burried down in the depth's of Google's amazing JavaScript?”文章中介绍了这种方法。Zeitoun 网站提供的 comet-iframe.tar.gz,封装了一个基于 iframe 和 htmlfile 的 JavaScript comet 对象,支持 IE、Mozilla Firefox 浏览器,可以作为参考。(请参见 参考资源

 

2.Ajax实现
  基于 AJAX 的长轮询(long-polling)方式
  https://www.ibm.com/developerworks/cn/web/wa-lo-comet/

  Ajax调用 XMLHttpRequest 对象发出 HTTP 请求 ,由于请求是异步的,不会阻塞客户端页面的操作,所以不需要iframe。
  客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。这样子不停的循环。


在这种长轮询方式下,客户端是在 XMLHttpRequest 的 readystate 为 4 时,数据传输结束,连接已经关闭。
readystate 为 3 时(数据仍在传输中),客户端可以读取数据,从而无须关闭连接,就能读取处理服务器端返回的信息。这种方式被称为Streaming AJAX 。
readyState等于3时,XMLHttpRequest的responseText返回的内容,不是本次变化新增的内容,而是之前接受到的内容+本次变化新增的内容。
IE 在 readystate 为 3 时,不能读取服务器返回的数据,目前 IE 不支持基于 Streaming AJAX

fig002.jpguploading.4e448015.gif正在上传…重新上传取消图 2. 基于长轮询的服务器推模型
readystate 为 4 时的循环方式

图 3. 基于流方式的服务器推模型
readystate 为 3 时的Streaming AJAX

 

注意:不要在同一客户端同时使用超过两个的 HTTP 长连接

我们使用 IE 下载文件时会有这样的体验,从同一个 Web 服务器下载文件,最多只能有两个文件同时被下载。第三个文件的下载会被阻塞,直到前面下载的文件下载完毕。这是因为 HTTP 1.1 规范中规定,客户端不应该与服务器端建立超过两个的 HTTP 连接, 新的连接会被阻塞。而 IE 在实现中严格遵守了这种规定。

HTTP 1.1 对两个长连接的限制,会对使用了长连接的 Web 应用带来如下现象:在客户端如果打开超过两个的 IE 窗口去访问同一个使用了长连接的 Web 服务器,第三个 IE 窗口的 HTTP 请求被前两个窗口的长连接阻塞。

 

 


其他心得

  1. HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了,换而言之,HTTP请求就没有长连接的说法,所以就没有短连接了。
  2. 网上所说的HTTP分为长连接和短连接,其本质是TCP连接。由于TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,所以TCP连接才有真正的长连接和短连接这一说法。

长连接,短连接:

  1. 短连接: 每次HTTP请求都会建立TCP连接,管理容易。
  2. 长连接: 只需要建立一次TCP连接,以后的HTTP请求重复使用同一个TCP连接,可是不易于管理。

 

长短连接的应用场景:

  1. 一般长连接主要是应用于实时性高的场景。
  2. 类似于WEB网站的HTTP服务一般都是使用短连接,为了方便于资源的回收。

长轮询,短轮询:

  1. 短轮询:重复发送HTTP请求,一般是死循环,我就是这么做的。
  2. 长轮询:CLIENT 和 SERVER 端一直建立着连接,等待目标响应。

 

 

参考文献:
数据同步笔记-长短轮询
  https://www.jianshu.com/p/4c241bea5836

Comet:基于HTTP长连接的“服务器推”技术
  https://www.cnblogs.com/rainman/archive/2011/11/28/2266193.html

基于 AJAX 的长轮询(long-polling)方式
  https://www.ibm.com/developerworks/cn/web/wa-lo-comet/

java实现
  https://blog.csdn.net/xxd851116/article/details/10022015

推技术ActiveXobject("htmlfile") 长连接
https://www.cnblogs.com/my_life/articles/2749709.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章