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 强制类型转换函数
May 17 Javascript
跟我一起学写jQuery插件开发方法(附完整实例及下载)
Apr 01 Javascript
JS继承 笔记
Jul 13 Javascript
js+html5实现可在手机上玩的拼图游戏
Jul 17 Javascript
详解JavaScript表单验证(E-mail 验证)
Mar 31 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
js实现随机抽选效果、随机抽选红色球效果
Jan 13 Javascript
JavaScript数据结构之二叉树的删除算法示例
Apr 13 Javascript
jQuery插件artDialog.js使用与关闭方法示例
Oct 09 jQuery
angularJs中orderBy筛选以及filter过滤数据的方法
Sep 30 Javascript
angularJs复选框checkbox选中进行ng-show显示隐藏的方法
Oct 08 Javascript
vue源码nextTick使用及原理解析
Aug 13 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
简单采集了yahoo的一些数据
2007/02/14 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
2016/07/13 PHP
javascript this用法小结
2008/12/19 Javascript
ExtJS扩展 垂直tabLayout实现代码
2009/06/21 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
jquery插件jquery.nicescroll实现图片无滚动条左右拖拽的方法
2015/08/10 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
Angularjs实现控制器之间通信方式实例总结
2018/03/27 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
Flask-WTF表单的使用方法
2019/07/12 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
2020/03/25 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
什么是servlet
2012/05/08 面试题
出纳的岗位职责
2013/11/09 职场文书
高一化学教学反思
2014/02/05 职场文书
离婚协议书范本(2014版)
2014/09/28 职场文书
幼师大班个人总结
2015/02/13 职场文书
优秀党员个人总结
2015/02/14 职场文书
2015年行风建设工作总结
2015/05/15 职场文书
关于教师节的广播稿
2015/08/19 职场文书
开机音效回归! Windows 11重新引入开机铃声
2021/11/21 数码科技
SQL Server使用CROSS APPLY与OUTER APPLY实现连接查询
2022/05/25 SQL Server