JavaScript数据推送Comet技术详解


Posted in Javascript onApril 07, 2016

JavaScript数据推送主要致力于webapp的在线推送服务,不用我们每次都像服务器去发送Ajax请求而主动从Server端推送数据到本地。

数据推送进化史:

1. HTTP协议简易轮询,保持着一个链接不放,或者通过前端不停的向后端发送请求

2. H5更新后有了WebSocket大大改善了双向和单向推送数据的便利性

3. SSE(Server-Send Event):服务器推送数据的新方式 

Comet:基于 HTTP 长连接的服务器推送技术
本课时介绍Comet:基于 HTTP 长连接的服务器推送技术,Comet 是一种 Web 应用架构。服务器端会主动以异步的方式向客户端程序推送数据(Ajax请求死循环),而不需要客户端显式的发出请求。Comet 架构非常适合事件驱动的 Web 应用,以及对交互性和实时性要求很强的应用,如股票交易行情分析、聊天室和 Web 版在线游戏等。

 1.先来看一个最简单的ajax请求json数据例子:

index.html

<meta charset="utf-8">
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
 $.ajax({
  url: 'data.php',
  dataType: "json",
  success: function(data){
   console.log(data);
  }
 });
</script>

data.php

<?php 
header('Content-type: application/json;charset=utf-8');
$res = array('success'=>'ok', 'text'=>'我是测试的文本');
echo json_encode($res);
?>

这样前端就能获取后端数据并输出。下面我们来模拟后端不断推送数据到前端:

一种办法是前端循环不断发送ajax请求

2.前端jQuery的Ajax不断发送请求:

index.html

<meta charset="utf-8">
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
function conn(){
 $.ajax({
  url: 'data.php',
  dataType: "json",
  success: function(data){
   console.log(data);
   conn();
  }
 });
}
conn(); 
</script>

data.php

<?php 
header('Content-type: application/json;charset=utf-8');
header("Cache-Control:max-age=0"); //设置没有缓存
sleep(1);
$res = array('success'=>'ok', 'text'=>'我是测试的文本');
echo json_encode($res);
?>

但是这样的连接轮询,网络请求浪费非常明显,我们也可以让后端服务器来循环做这件事情,看下面例子

3.原生Ajax,服务器隔一段时间推送一次(后端循环,用ob_flush()和flush()吐数据)

data.php

<?php 
// header('Content-type: application/json;charset=utf-8');
header("Cache-Control:max-age=0"); //设置没有缓存
$i = 0;
while ($i<9) {
 $i++;
 // $res = array('success'=>'ok', 'text'=>'我是测试的文本');
 // echo json_encode($res);
 sleep(1);
 $radom = rand(1,999);
 echo $radom;
 echo '<br/>';
 ob_flush(); //输出缓存,必须和flush()一起使用
 flush(); //缓存吐到浏览器
}
?>

前台js(原生js实现ajax,并当状态改变时,进行输出) 参考:https://3water.com/article/82085.htm

var getXmlHttpRequest = function() {
 if (window.XMLHttpRequest) {
  //主流浏览器提供了XMLHttpRequest对象
  return new XMLHttpRequest();
 } else if (window.ActiveXObject) {
  //低版本的IE浏览器没有提供XMLHttpRequest对象
  //所以必须使用IE浏览器的特定实现ActiveXObject
  return new ActiveXObject("Microsoft.XMLHttpRequest");
 }

};
var xhr = getXmlHttpRequest();
xhr.onreadystatechange = function() {
 console.log(xhr.readyState);
 if (xhr.readyState === 3 && xhr.status === 200) {
  //获取成功后执行操作
  //数据在xhr.responseText
  console.log(xhr.responseText);
 }
};
xhr.open("get", "data.php", true);
xhr.send("");

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
符合W3C网页标准的iframe标签的使用方法
Jul 19 Javascript
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
IE DOM实现存在的部分问题及解决方法
Jul 25 Javascript
js跳转页面方法实现汇总
Feb 11 Javascript
深入理解Javascript里的依赖注入
Mar 19 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
Node.js中如何合并两个复杂对象详解
Dec 31 Javascript
Javascript中click与blur事件的顺序详析
Apr 25 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
Oct 08 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 Javascript
Vue computed 计算属性代码实例
Apr 22 Javascript
JavaScript继承的三种方法实例
May 12 Javascript
js实现商品抛物线加入购物车特效
Nov 18 #Javascript
js类式继承与原型式继承详解
Apr 07 #Javascript
javascript原型继承工作原理和实例详解
Apr 07 #Javascript
浅析JS原型继承与类的继承
Apr 07 #Javascript
AngularJs 弹出模态框(model)
Apr 07 #Javascript
详解AngularJS 模态对话框
Apr 07 #Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
Apr 07 #Javascript
You might like
PHP实现分页的一个示例
2006/10/09 PHP
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
如何让您的中波更粗更长 - 中波框形天线制作
2021/03/10 无线电
更正确的asp冒泡排序
2007/05/24 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
JQuery实现倒计时按钮的实现代码
2012/03/23 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
javascript数据类型示例分享
2015/01/19 Javascript
jQuery对JSON数据进行排序输出的方法
2015/06/24 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
深入理解nodejs搭建静态服务器(实现命令行)
2019/02/05 NodeJs
Node.js 路由的实现方法
2019/06/05 Javascript
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
基于Django ORM、一对一、一对多、多对多的全面讲解
2019/07/26 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
2014春晚主持词
2014/03/25 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
暑期社会实践证明书
2014/11/17 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
Nginx 过滤静态资源文件的访问日志的实现
2021/03/31 Servers
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android