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操作checkbox用document.getElementById实现
Oct 12 Javascript
jQuery中unwrap()方法用法实例
Jan 16 Javascript
基于javascript实现文字无缝滚动效果
Mar 22 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
May 27 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
Jan 17 Javascript
vue.js树形组件之删除双击增加分支实例代码
Feb 28 Javascript
input 标签实现输入框带提示文字效果(两种方法)
Oct 09 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
Dec 22 Javascript
js中自定义react数据验证组件实例详解
Oct 19 Javascript
vue实现百度搜索功能
Dec 28 Javascript
Vue项目打包、合并及压缩优化网页响应速度
Jul 07 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
简单的用PHP编写的导航条程序
2006/10/09 PHP
php xml留言板 xml存储数据的简单例子
2009/08/24 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
2014/10/13 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
Laravel使用memcached缓存对文章增删改查进行优化的方法
2016/10/08 PHP
PHP实现添加购物车功能
2017/03/06 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
浅析创建javascript对象的方法
2016/05/13 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
推荐几个不错的console调试技巧实现
2019/12/20 Javascript
JavaScript实现鼠标移入随机变换颜色
2020/11/24 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
[01:18:43]2014 DOTA2华西杯精英邀请赛5 24 iG VS DK
2014/05/25 DOTA
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
Windows8下安装Python的BeautifulSoup
2015/01/22 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
django实现模板中的字符串文字和自动转义
2020/03/31 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
澳大利亚家具商店:Freedom
2020/12/17 全球购物
外企C语言笔试题
2013/11/10 面试题
大学信息公开实施方案
2014/03/09 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
教师自查自纠工作情况报告
2014/10/29 职场文书
2015小学师德工作总结
2015/07/21 职场文书
婚宴新郎致辞
2015/07/28 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书