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 相关文章推荐
Js 本页面传值实现代码
May 17 Javascript
JavaScript的各种常见函数定义方法
Sep 16 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
jquery实现键盘左右翻页特效
Apr 30 Javascript
Jquery1.9.1源码分析系列(六)延时对象应用之jQuery.ready
Nov 24 Javascript
Vue.js每天必学之过渡与动画
Sep 06 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
Dec 03 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
Apr 12 Javascript
Spring shiro + bootstrap + jquery.validate 实现登录、注册功能
Jun 02 jQuery
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
Aug 18 Javascript
AngularJS 仿微信图片手势缩放的实例
Sep 28 Javascript
原生JS实现的碰撞检测功能示例
May 18 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在Apache下的两种模式的安装
2006/09/05 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
28个JS验证函数收集
2010/03/02 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
JS常用函数使用指南
2014/11/23 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
微信小程序上传多图到服务器并获取返回的路径
2019/05/05 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
2020/11/16 Javascript
使用Python写个小监控
2016/01/27 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
在Python中表示一个对象的方法
2019/06/25 Python
python实现桌面气泡提示功能
2019/07/29 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
Python各种扩展名区别点整理
2020/02/27 Python
Python网络爬虫信息提取mooc代码实例
2020/03/06 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
python如何实现递归转非递归
2021/02/25 Python
乌克兰在线药房:Аптека24
2019/10/30 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
《燕子专列》教学反思
2014/02/21 职场文书
寄语学生的话
2014/04/10 职场文书
2014年审计工作总结
2014/11/17 职场文书
幼儿园六一主持词
2015/06/30 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏