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 相关文章推荐
禁止选中文字兼容IE、Chrome、FF等
Sep 04 Javascript
js中跨域方法原理详解
Jul 19 Javascript
JS日期格式化之javascript Date format
Oct 01 Javascript
深入探秘jquery瀑布流的实现
Jan 30 Javascript
Web打印解决方案之证件套打的实现思路
Aug 29 Javascript
Angular2 多级注入器详解及实例
Oct 30 Javascript
JavaScript中清空数组的方法总结
Dec 02 Javascript
Ajax 加载数据 练习代码
Jan 05 Javascript
Vue实现active点击切换方法
Mar 16 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
Jul 19 Javascript
Vue文本模糊匹配功能如何实现
Jul 30 Javascript
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 Vue.js
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
支持oicq头像的留言簿(二)
2006/10/09 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
nodejs初始化init的示例代码
2018/10/10 NodeJs
详解NodeJS Https HSM双向认证实现
2019/03/12 NodeJs
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
Python使用getpass库读取密码的示例
2017/10/10 Python
Python中的groupby分组功能的实例代码
2018/07/11 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
django基于restframework的CBV封装详解
2019/08/08 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
超市业务员岗位职责
2013/12/05 职场文书
企业家王石演讲稿:坚持与放下
2014/04/27 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
标准单位租车协议书
2014/09/23 职场文书
故宫的导游词
2015/01/31 职场文书
街道社区活动报告
2015/02/05 职场文书
催款通知书范文
2015/04/17 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
高质量“欢迎词”
2019/04/03 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP