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 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
精通Javascript系列之数值计算
Jun 07 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
Sep 04 Javascript
JQuery入门基础小实例(1)
Sep 17 Javascript
基于JavaScript实现随机颜色输入框
Dec 10 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
Dec 26 Javascript
webpack-dev-server远程访问配置方法
Feb 22 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
vue组件tabbar使用方法详解
Nov 06 Javascript
JS+HTML5 canvas绘制验证码示例
Dec 05 Javascript
vue响应式系统之observe、watcher、dep的源码解析
Apr 09 Javascript
Vue-resource安装过程及使用方法解析
Jul 21 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
我的群发邮件程序
2006/10/09 PHP
PHP 的异常处理、错误的抛出及回调函数等面向对象的错误处理方法
2012/12/07 PHP
怎么在Windows系统中搭建php环境
2013/08/31 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
PHP学习记录之数组函数
2018/06/01 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
js关闭模态窗口刷新父页面或跳转页面
2012/12/13 Javascript
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
浅谈javascript中的 “ &amp;&amp; ” 和 “ || ”
2017/02/02 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
layui 解决富文本框form表单提交为空的问题
2019/10/26 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
MADE法国:提供原创设计师家具
2018/09/18 全球购物
文案策划岗位职责
2015/02/11 职场文书
员工辞职信范文大全
2015/05/12 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
pytorch交叉熵损失函数的weight参数的使用
2021/05/24 Python