我们使用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. Laravel 5.1中 Redis 的安装配置及基本使用教程

    关于Redis的介绍我们在之前Laravel 缓存配置一节中已有提及,Redis是一个开源的.基于内存的数据结构存储器,可以被用作数据库.缓存和消息代理.相较Memcached而言,支持更加丰富的数据 ...

  2. MDIO/MDC(SMI)接口

    转载:http://blog.chinaunix.net/uid-24148050-id-132863.html 1. 简介 The MDIO interface is a simple, two-w ...

  3. c语言全局变量

    1.全局变量 #include <stdio.h> int L,n; void solve() { // printf("%d",L); printf("%d ...

  4. VBA-工程-找不到工程或库-解决方案

    近来,越来越多的朋友被“找不到工程或库”的错误所烦恼,所以决定新开一帖来聊聊此问题! QUOTE: 一般情况下,出现此错误是因为找不到引用工程,或找不到与工程语言对应的引用的对象库 出现此类错误可以根 ...

  5. DataBase 之 数据库中的系统表

    名称                       地址                                                        说明 sysaltfiles    ...

  6. Recommended you 3 most popular Nissan pincode calculators

    Have you still felt confused on how to choose a satisfactory Nissan pin code calculator in the marke ...

  7. myEclipse6.5与数据库(SQL Server2008)连接遇到的问题(自己总结的干货)<用SSH框架的时候,用servlet+javabean+jsp的时候>

    昨天因为学习SSH框架的搭建,时隔一年又重新遇到了myEclipse连接数据库的问题.废话不多说,上干货 (以下全部按照我遇到的问题的顺序,也就是没有顺序,就是任性) 请注意:这是在myEclipse ...

  8. Java作业代写

    作业一 试用java编写一个九九乘法表并打印. 作业二: 设计两个人类与书类,并设置两者的关系,试用人去找书,书去找人,假如某人有一个儿子,它也有一本书,试用儿子去找书,书找儿子. 大作业 熟悉QQ农 ...

  9. 给jdk写注释系列之jdk1.6容器(2)-LinkedList源码解析

    LinkedList是基于链表结构的一种List,在分析LinkedList源码前有必要对链表结构进行说明.   1.链表的概念      链表是由一系列非连续的节点组成的存储结构,简单分下类的话,链 ...

  10. HDU 1978 How many ways (DP)

    How many ways Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...