转载自: http://xiaocaicode.lofter.com/post/cf1f9_7b6507?mydomainr=true
用node.js(socket.io)实现数据实时推送
在做商品拍卖的时候,要求在商品的拍卖页面需要实时的更新当前商品的最高价格。实现的方式有很多,比如:
1.setInterval每隔n秒去异步拉取数据(缺点:更新不够实时)
2. AJAX轮询方式方式推送数据(缺点:服务端需要在死循环中反复查询数据库)
3.websocket推送数据(缺点:仅支持html5标准的浏览器)
socket.io的简要介绍
所 有客户端都通过socket.io挂在nodejs服务器上(注意: 只是挂着,不需要任何循环,因为它是事件驱动的);需要推送消息了,服务器就与 nodejs通信(比如访问某个地址来实现),告诉它推送什么消息到哪里;nodejs收到推送信号后,则通过socket.io实时传输数据给浏览器。 这个其实也是一条单向的路,因为nodejs服务器不具备与php通信的能力,实际上也不需要,网页上直接连php就可以了。
可以参考这篇文章:PHP ServerPush (推送) 技术的探讨
接下来开始整理下思路
1.正如简要介绍中所说的首先要将客户端都通过socket.io挂在nodejs服务器上.
在用户进入拍卖页面后开始连接socket.io ,然后将当前客户端的'用户id','拍卖id','当前最高价','socket.id'存储至node.js全局变量socketUser中.
//客户端
var socket = io.connect("http://demo.xiaocai.name":339");
socket.on('conn', function (data) {
var postdata = {
'c_id' : PageValue.charinfo.c_id, //用户id
'c_name' : PageValue.charinfo.c_name, //用户昵称
'guid' : PageValue.infodata.id,//拍卖id
'price' : PageValue.infodata.max_price,//当前最高价
}
socket.emit('login', postdata,function(result){
console.log('登陆成功');
});
});
//服务端
var sio = require('socket.io');
var express = require('express');
var app = module.export = express.createServer();
//初始化
var socketUser = {};
io = sio.listen(app);
io.set('log level', 1);//将socket.io中的debug信息关闭
//监听连接
io.sockets.on('connection', function (socket){
//响应连接
io.sockets.emit('conn', { text: 'socketId:'+socket.id});
//监听用户登录并存储socket
socket.on('login', function (data,fn) {
socketUser[socket.id] = {'c_id':data.c_id,'guid':data.guid,'price':data.price,'socket':socket};
});
//监听断线
socket.on('disconnect', function(){
console.log('-链接断开['+socket.id+']-');
delete socketUser[socket.id];
});
});
2.需要推送消息时服务器就与nodejs通信告诉它推送什么消息到哪里
当有用户出价时最高价格将发生改变,这时候通过socket.io来监听这个动作,接着向挂在nodejs服务器上的socket客户端推送数据.
前端js:某个客户端用户给出了新的价格时发出请求‘postprice’并带上当前拍卖的id
socket.emit('postprice', {'guid':PageValue.infodata.id});
服务端nodejs:服务端监听请求postprice并执行pushprice方法向其它客户端推送消息
socket.on('postprice', function (data,fn) {
console.log('-用户出价['+data.guid+']-');
pushprice(data.guid);
});
从redis缓存中读取出当前拍卖的最高价,然后遍历该拍卖下的socketUser集合,若它的价格低于取出的最高价则向它推送最新的价格(并且更新它的最高价).GetRedisKey是个读取reids的方法该方法在底部贴出.
var pushprice = function(guid){
console.log('-推送数据['+guid+']-');
common_func.GetRedisKey("AuctionMaxPrice-"+guid,function(val){
if(!val){
return false;
}
for(var values in socketUser){
if( parseFloat(socketUser[values].price) < val && socketUser[values].guid == guid ){
socketUser[values].socket.emit('receive',{'nowprice':val});
socketUser[values].price = val;
}
}
});
}
3.客户端接受推送的数据
socket.on('receive',function(maxprice){
$('#NowUserTxt').html('¥'+maxprice);
});
GetRedisKey是公共函数中获得redis缓存的方法,这边单独贴出来
exports.GetRedisKey = function(key,fun){
if( typeof redis_client == 'undefined' ){
var redis = require("redis");
redis_client = redis.createClient(RedisPort,RedisHost);
redis_client.on("error", function (err) {
common_func.insertlog("Error(redis): " + err);
})
}
redis_client.get(key, function (err, reply) {
if(reply){
fun(reply.toString());
}else{
fun(false);
common_func.insertlog('Error(redis): get('+key+') not data');
}
});
}
相关推荐
随着web技术的发展,使用场景和需求也越来越复杂,客户端不再满足于简单的请求得到状态的需求。...WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocke
基于Node.js+Vue.js开发的全栈开发社区团购商城源码+项目说明.zip 【server端】 1.使用koa框架开发 2.数据库使用mongoose,redis 3.使用socket.io给在线用户发送活动信息 4.使用jsonwebtoken,koa-jwt做登陆认证 5....
这允许非 socket.io 网络应用程序向其所有客户端发送实时推送通知。 将来我们可能会扩展 switchboard.io 以允许客户端也将事件推送到服务器。 项目来源 我喜欢 socket.io...当我在 Node.js 中编写 Web 应用程序时...
轻量级推送服务和实时在线监控平台,基于node的socket.io,支持web、android、ios客户端,支持移动端离线推送,可大规模集群部署
我尝试使用mongo,express,React-native,node.js和socket.io创建实时聊天应用程序 具有各种功能的全栈式社交媒体应用程序:完整的CRUD功能(您可以创建,搜索,过滤,编辑和删除用户帐户,消息,公共聊天室,私人...
适用于 Node.js V1.3.7 的实时框架服务器推送(基于 perfmjs-node、socket.io、Redis) 特征: 基于 perfmjs-node、socket.io、perfmjs-redis-cluster 支持使用服务器推送、WebSocket、Polling-xhr、Polling-...
随着互联网技术的快速发展,基于B/S架构的实时通讯和...使用node.js平台和socket.io库技术设计并实现了一种基于websocket协议的服务器实时消息推送平台。运行测试结果显示能快速稳定地实现消息的实时服务器推送。
通过 WebSocket 实现站内信功能,任务看板中,实现更新同步推送。一旦其他项目成员有对我们当前查看的项目任务做任何的操作,页面都将立即同步更新,并向此任务的所有参与者(除了操作者)发送消息通知。注册和找回...
成功设置服务工作者并推送通知的步骤 将您的服务工作者文件放在公用文件夹中 注册服务人员时,请使用“作用域”。 对于推送通知,您需要VAPID密钥 要创建VAPID密钥,请使用以下过程。 npm install -g web-push 网络...
使用socket.io进行实时通知的 Node.js 应用程序 先决条件(Ubuntu 14.04) sudo apt-get install -y build-essential curl sudo apt-get install -y npm sudo apt-get install -y nodejs npm install -gn n ...
要求Node.JS(在v0.4.7上测试) 雷迪斯这个怎么运作Socket.IO群集包括三个部分: frontend-node-提供项目的用户页面,闪存套接字策略文件以及可用的io-nodes列表io-node-使用websockets,flashsockets等与用户保持...
它可以监听接收和推送消息到 socket.io 客户端。安装 $ npm install运行服务器 $ node app.js要发布的消息发布到redis通道的消息应该是json字符串,并且应该有一个名为user_id的项目,用于标识用户。例子该示例显示...
随着互联网的飞速发展,网页中实时通讯和消息推送的应用愈加广泛。传统上采用定时轮询或Comet 的方式实现实时通讯,但对服务器...本文使用Node.js 平台和Socket.IO 组件设计并实现了WebSocket 实时消息推送网页应用。
客户端服务器客观的使用RaspberryPi作为Web服务器并将数据实时推送到同一网络上的客户端技术栈前端: HTML CSS 后端: Node.js ExpressJS(Node.js的Web应用程序框架) Socket.io(启用Web客户端和服务器之间的实时...
使用 socket.io 在客户端/浏览器和 node.js 服务器之间同步 POJO ##它能做什么 该库允许您在多个客户端和服务器之间保持数据对象是最新的。 这个怎么运作 一旦你与Client.put(object)共享了一个对象,它(以及它...
socketio-kafka 使用 Socket.io 向客户端推送 Kafka 消息。 基于。要求卡夫卡。 提供了有关设置简单 ZooKeeper 服务器和 Kafka 代理的说明。 和 npm跑步启动Kafka,例如打开两个shell并启动zookeeper,然后是kafka:...
功能亮点缩小并连接JS和CSS以快速加载页面标签呈现命名空间透明预处理器使用Socket.IO将CSS更改推送到浏览器与服务器轻松共享代码出色的Node.js资产管理器借助Stackr ,您可以直接从代码中干净地管理所有JavaScript...
E.M.S消息推送与搜索服务(服务于,==不适用于其它项目,但可供参考==)ZUCC问答论坛项目简介核心功能为课堂问答,学生和老师可以在此提问与回答。...项目结构图功能特性ES与Mysql数据同步Socket.io实时推送Expre
Delivery.js使用Node.js和Socket.IO来简化将文件推送到客户端或将其发送到服务器的过程。 可以将文件以文本(utf8)或base64(用于图像和二进制文件)的形式推送到客户端。 安装 npm install delivery -g 浏览器...
big-screen-server 大数据可视化,后台服务,基于koa,mysql,mongose...后台 通过配置组件,传输前端,拖拽生产大屏, 同时 通过 socket.io 根据不同 角色推送大屏 组件,以及数据结构。实现大屏整体更新。 结合 vue-c