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秒一次访问下服务 ...
 
随机推荐
- 关于AutoComplete整合
			
AutoComplete应该不是很陌生了,网上也有好多开源的js.今天主要的不是研究Autocomplete这个js的实现.今天主要讲的是将这个js做成一插件.那么今天主要用到的 js插件jquery ...
 - inux2.6.xx内核代码分析( 72节)
			
http://blog.csdn.net/ustc_dylan/article/category/469214
 - #pragma_pack(n)_与___attribute(aligned(n))
			
#pragma pack(n) 与 __attribute(aligned(n)) 在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也 ...
 - Mac 开发者的十八般兵器:重温 10 篇热文
			
<开发者 MAC 电脑里的十八般兵器> 古人常以刀.枪.剑.戟.斧.钺.铲.叉.鞭.锏.锤.戈.镋.棍.槊.棒.矛.钯十八种兵器,样样精通,来形容一个人的武学技能get状态.在开发者的世界 ...
 - SQL Server:替换文本中的回车和换行符
			
--替换回车符 update master_locationSET street_number = REPLACE(street_number, CHAR(13), '') --替换换行符 updat ...
 - oracle--insert
			
常规insert语法就不说了,还有些特殊用法 1. insert all into table1(col1,col2) values(v1,v2) into table2(col1,col2) va ...
 - [未完成]关于xml文件的解析
			
附录一个比较特别的xml文件. MultiNamespaceInlineRequest.xml <?xml version="1.0" encoding="ISO- ...
 - AI 对不起  我还爱着你
			
艾弗森,对不起,我还爱着你.有时候我自己都不知道自己我怎么了,直到最后才发现,我还爱着你. 那天起,我认识了你,便一发不可收拾.这些天,谢谢你,似乎因为你的影响让我改变了,坚持了许多.致以至今我才发现 ...
 - 用Activator.CreateInstance代替new实现类的实例化(转)
			
一直想得到这样一个函数,输入一个类的名称为参数,返回一个相应的类的实例. 这在工厂模式中是非常有用的 这样,可以使程序有更高的扩展性,例如,,下面的例子 如果现在有一个类,专门用来计算交通工具的速度, ...
 - linux两种增加交换分区(swap)的方法
			
在安装Oracle后,为使Oracle流畅运行,需要手动增加linux的交换分区(相当于Windows下的虚拟内存)的大小,本文介绍两种增加交换分区(swap)的方法. 第一种方法:新建分区 1.fd ...