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 相关文章推荐
JavaScript使用prototype定义对象类型
Feb 07 Javascript
Prototype 工具函数 学习
Jul 23 Javascript
浅谈javascript 面向对象编程
Oct 28 Javascript
IE event.srcElement和FF event.target 功能比较
Mar 01 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
Jan 15 Javascript
js获取html参数及向swf传递参数应用介绍
Feb 18 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
Aug 24 Javascript
Ionic默认的Tabs模板使用实例
Aug 29 Javascript
JS二分查找算法详解
Nov 01 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
May 16 Javascript
Vue中的验证登录状态的实现方法
Mar 09 Javascript
JavaScript实现无限轮播效果
Nov 19 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
初探PHP5
2006/10/09 PHP
用php获取本周,上周,本月,上月,本季度日期的代码
2009/08/05 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
JavaScript异步编程Promise模式的6个特性
2014/04/03 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
jQuery实用技巧必备(中)
2015/11/03 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
vue实现nav导航栏的方法
2017/12/13 Javascript
Vue 项目分环境打包的方法示例
2018/08/03 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
Python实现新浪博客备份的方法
2016/04/27 Python
python下os模块强大的重命名方法renames详解
2017/03/07 Python
python3处理含有中文的url方法
2018/05/10 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
python cv2截取不规则区域图片实例
2019/12/21 Python
python程序输出无内容的解决方式
2020/04/09 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
CSS3绘制有活力的链接下划线
2016/07/14 HTML / CSS
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
工会积极分子个人总结
2015/03/03 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
消夏晚会主持词
2015/06/30 职场文书
护理心得体会范文
2016/01/22 职场文书
mysql主从复制的实现步骤
2021/10/24 MySQL