我们使用ajax与后台服务进行交互,常常是通过触发事件来单次交互,但对于有些web应用来说,需要前台与后台保持长连接,前端不定时地接收后台推送的数据信息,

例如:股票行情分析、聊天室和网页在线游戏等。

怎么做到呢?

最笨的方法: 前端需要隔一段时间向服务器发送一次ajax,请求成本太昂贵呀,就好比,你每次约炮,都得开房,还是租一个便宜点儿房子合算。

所以不能这么做。

1.comet

原理:comet是基于HTTP长连接的服务器推送技术,是一种web应用架构,服务器会主动以异步的方式向客户端程序推送数据,而不需要客户端显示的发出请求,

当前端与服务器连接完一次后,保持长链接,让服务器来做推送,服务器利用缓存技术来实现

comet非常适合事件驱动的web应用,以及对交互性与实时要求很强的应用。

前端js代码

var xhr = (function(){
if(typeof XMLHttpRequest != undefined){
return new XMLHttpRequest
}else{
return new ActiveXObject("Microsoft.XMLHttp")
}
})(); xhr.open("GET", url, true);
xhr.send(data); xhr.onreadystatechange = function(){
if(xhr.readyState == 3){
if(xhr.status == 200){
xhr.responseText;
}
}
};

后台代码(这里用PHP实现)

<?php
//设置响应输出头
header("Content-Type:application/json;charset=UTF-8");
header("Cache-Control:max-age=0");//去除缓存
$i= 0;
while($i<9){
$i++;
$res = ["success"=>"ok","text"=>i] ;//结果
echo json_encode($res);
//刷新页面流,不缓存
ob_flush();
flush();结束流
}
?>

2.websocket

   没有Network请求,节省资源

   前端:

var socket,state=-1;
function connect(){
console.log("Connection Begin:");
if(socket == null || socket.readyState != 1){
socket = new WebSocket(host);
} socket.onerror = function(){
console.log("Connection error!")
} socket.onopen = function(e){
console.log("Connection isavaliable!");
} socket.onmessage = function(e){
console.log("Receive ServerMessage Beign:");
document.querySelector("#txtarea").innerHTML = e.data;
console.log("Receive ServerMessage End!");
} socket.onclose = function(e){
console.log("Connection closed!");
document.querySelector("#txtarea").innerHTML += "/n" + event.wasClean + ";" + event.code + ";" + event.reason;
}
} function send(){
if(socket.readyState == 1){
console.log("Send Message Begin:");
var text = document.querySelector("#text").value;
var message = {
time : new Date(),
clientId : "049";
};
if(text=="" || message == null){
console.log("No date to send!");
return;
}
socket.send(JSON.stringify(message));
socket.send(text);
console.log("Send Message End!");
}else{
console.log("Connection not aviliable,please create connection!");
}
} /**
* Web Socket 任何时候都可以关闭,没有什么限制
* 可以根据需求进行控制
*/
function disconnect(){
console.log("Close Connection Begin:"); socket.close();
}

   后端:需要使用node,个人不懂node,只是看了一点点,如果写错了,请见谅! 去他地把,管她好不好看呢,自己约的炮,含着泪也得打完

var sys = require('sys');
var ws = require('websocket');
var server = ws.createServer();
server.addEventListener('connection',function(conn){//当客户端接入时
conn.send('hi,'+conn.id);//向客户端发送消息
conn.addEventListener('message',function(msg){//当收到客户端发来的消息时
console.log('Recieved message :' + msg);
var i=0;
while(i<9){
i++;
server.broadcast(i);//向所有客户端广播消息
conn.send(i);
}
});
});
server.addEventListener('close',function(conn){
server.broadcast('Disconnected: ' + conn.id);
});
server.listen(8000);
console.log('Hello,Server is Running:8000');

3.SSE方式

   SSE: Server - Send Event   浏览器新API

   不需要ajax,可以实现实时动态刷新数据

var source = new EventSource(url);
function init(){
source.onopen = function(){
console.log('connect:' + this.readyState);
}
source.onmessage = function(e){
console.log('Recieve:' + e.data);
}
source.onerror = function(e){
console.log('error');
}
} init();

后台:还是php,请叫我P哥

<?php
//设置响应输出头
header("Content-Type:text/event-stream;charset=UTF-8");
header("Access -Control-Aollow-Origin:http:/IP/");
echo "data:现在是北京时间:".date('H:i:s')."<br/>"
?>

随着H5的发展,个人相信,这种数据推送技术会得到更广的应用

   

 

javascript之数据推送的更多相关文章

  1. 使用Node.js实现数据推送

    业务场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的 ...

  2. HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

    传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...

  3. SSE技术详解:使用 HTTP 做服务端数据推送应用的技术

    SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来 ...

  4. kafka和websocket实时数据推送

    需求 ​ 已有Kafka服务,通过kafka服务数据(GPS)落地到本地磁盘(以文本文件存储).现要根据echarts实现一个实时车辆的地图. 分析 前端实时展现:使用websocket技术,实现服务 ...

  5. HTML5数据推送SSE原理及应用开发

    JavaScript表达行为,CSS表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  6. 理解HTML5数据推送应用开发问题

    一.数据推送 SSE是一种允许服务端向客户端推送新数据(通常称作数据推送)的HTML5技术.那么,究竟什么是数据推送?它与我们可能用过的其他技术有什么不同呢? 让我先来回答什么不是数据推送.数据推送有 ...

  7. HTML5 SSE 数据推送应用开发

    javascript表达行为,css表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...

  8. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

    本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...

  9. 基于Web的数据推送技术(转)

    基于Web的数据推送技术 对于实时性数据显示要求比较高的系统,比如竞价,股票行情,实时聊天等,我们的解决方案有以下几种.1. HTTP请求发送模式,一般可以基于ajax的请求,比如每3秒一次访问下服务 ...

随机推荐

  1. [原 -> 砖] C# IEnumerable<T>泛型取值

    为什么要写这个?因为发现,很多人在读取泛型集合中Item的值时,使用的方法是 item.GetType().GetField("xxxxx").GetValue() 或类似的写法. ...

  2. 详解SQL Server连接(内连接、外连接、交叉连接)

    在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...

  3. 关于设置android:imeOptions属性无效的解决办法

    在对Android的EditText控件进行设置时,经常会限定一下输入法的属性,设置右下角为完成或者搜索等,一般都会想到android:imeOptions属性,但是仅仅这么设置通常是无效的,还要搭配 ...

  4. C++: Why pass-by-value is generally more efficient than pass-by-reference for built-in (i.e., C-like) types

    A compiler vendor would typically implement a reference as a pointer. Pointers tend to be the same s ...

  5. [改善Java代码]建议40:匿名类的构造函数很特殊

    建议40: 匿名类的构造函数很特殊 在上一个建议中我们讲到匿名类虽然没有名字,但可以有一个初始化块来充当构造函数,那这个构造函数是否就和普通的构造函数完全一样呢?我们来看一个例子,设计一个计算器,进行 ...

  6. 如何使用CSS实现小三角形效果

    如何使用CSS实现小三角形效果:建议:尽可能的手写代码,可以有效的提高学习效率和深度.在众多的网页效果中,都有小三角形效果的应用,能够增加特定应用的美观度,下面就给出一段实例代码,里面介绍了两种实现小 ...

  7. Bootstrap ACE后台管理界面模板-jquery已整理

    做后台通用模板,基于bootstrap,jquery写成的模板,非常齐全.国内不能正常访问google我将不能访问的jquery替换成cdn.bootcss.com网站下的jquery 链接: htt ...

  8. Redis - 环境的安装配置

    Redis 下载安装步骤: 下载 redis 源码: [huey@huey-K42JE ~]$ wget http://download.redis.io/releases/redis-x.y.z.t ...

  9. Android Support v4,v7,v13

    Android Support v4 是最早(2011年4月份)实现的库.用在Android1.6 (API lever 4)或者更高版本之上.它包含了相对V4, V13大的多的功能. 例如:Frag ...

  10. 和阿文一起学H5--如何把H5压缩到最小

    三种压缩图片的方法: 1.PS 但是PS每次只能压缩一张,下面介绍第二个神器 2.TinyPng压缩 https://tinypng.com/ 3.IloveIMG压缩 http://www.ilov ...