javascript之数据推送
我们使用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之数据推送的更多相关文章
- 使用Node.js实现数据推送
业务场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器). 后端推送数据的解决方案有很多,比如轮询.Comet.WebSocket. 1. 轮询对于后端来说开发成本最低,就是按照传统的 ...
- HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)
传统的WEB应用程序通信时的简单时序图: 现在Web App中,大都有Ajax,是这样子: HTML5有一个Server-Sent Events(SSE)功能,允许服务端推送数据到客户端.(通常叫数据 ...
- SSE技术详解:使用 HTTP 做服务端数据推送应用的技术
SSE ( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议. 严格地说,HTTP 协议是没有办法做服务器推送的,但是当服务器向客户端声明接下来 ...
- kafka和websocket实时数据推送
需求 已有Kafka服务,通过kafka服务数据(GPS)落地到本地磁盘(以文本文件存储).现要根据echarts实现一个实时车辆的地图. 分析 前端实时展现:使用websocket技术,实现服务 ...
- HTML5数据推送SSE原理及应用开发
JavaScript表达行为,CSS表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...
- 理解HTML5数据推送应用开发问题
一.数据推送 SSE是一种允许服务端向客户端推送新数据(通常称作数据推送)的HTML5技术.那么,究竟什么是数据推送?它与我们可能用过的其他技术有什么不同呢? 让我先来回答什么不是数据推送.数据推送有 ...
- HTML5 SSE 数据推送应用开发
javascript表达行为,css表达外观,注意HTML既表达结构(逻辑结构),又表达内容(数据本身)通常需要更新数据时,并不需要更新结构,正是这种不改变组织结构仅改变数据的诉求,推动了数据拉取和数 ...
- C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表
本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...
- 基于Web的数据推送技术(转)
基于Web的数据推送技术 对于实时性数据显示要求比较高的系统,比如竞价,股票行情,实时聊天等,我们的解决方案有以下几种.1. HTTP请求发送模式,一般可以基于ajax的请求,比如每3秒一次访问下服务 ...
随机推荐
- ActionScript 3 中的强制类型转换
以前AS中是这样进行强制类型转换的:假设有一个类叫做Class1,我们声明了一个它的对象 c1,如果想要将它转换成Class2类型,只要这样写: Class2(c1); 在AS3中你依然可以这样写,但 ...
- 详解SQL Server连接(内连接、外连接、交叉连接)
在查询多个表时,我们经常会用“连接查询”.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志. 什么是连接查询呢? 概念:根据两个表或多个表的列之间的关系,从这些表中查询数据 ...
- PHP设计模式之策略模式
前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...
- css笔记13:display用法
1.代码演示: element.html如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- html/css 两个div在同一行
在界面设计的时候,经常需要将两个div在同一行显示. 但是每次都会忘记怎么做,特此随笔,备忘. 如以下要将“第一个div”和“第二个div”显示在同一行: <div id="id1&q ...
- signed char、unsigned char
什么是无符号char类型?与常见的char类型有何不同? 在c++中有三种不同的字符类型:char,signed char,unsigned char.如果要应用与文本字符,就使用不加限制的char类 ...
- ASP.NET MVC and jqGrid 学习笔记 2-如何从本地获得数据
上回说到jqgrid的基本配置,同时演示了显示数据的一种方法——datatype: "local".这种方法是从本地获取的,确切地说是在前端页面的javascript里写的硬编码. ...
- python(1) - 安装篇
本次主要在windows下安装pyton2 和python3,实现 在cmd中输入 ptynon进入python2 在cmd中输入python3进入python3 第一步 当然是要下载python安装 ...
- C++中枚举定义运算符
由于枚举也是用户定义类型,所以是可以定义运算符, 如: enum Day {sun, mon, tue, wen, thu, fri, sat}; Day& operator++(Day&am ...
- mysql由于外键关联无法删除数据
在mysql中删除一张表时候,出现 Error No. 1451 Cannot delete or update a parent row: a foreign key constraint fail ...