转载自: 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');
}
});
}
相关推荐
### 使用Node.js+Socket.IO搭建WebSocket实时应用 #### WebSocket与实时推送技术 随着互联网技术的发展,用户对于数据的即时性有了更高的要求。实时推送技术,即Realtime技术,旨在实现无需用户手动刷新页面就能...
在客户端,使用 Socket.IO.min.js 可以轻松地建立 WebSocket 连接,并进行实时数据传输。 应用场景: Socket.IO 在以下场景中特别有用: 实时通信应用程序: 如聊天应用、在线游戏、协作工具等,需要即时更新和...
通过这些库,Android应用可以直接与运行在Node.js上的Socket.IO服务器进行交互,实现数据的实时推送和接收。 使用Socket.IO进行实时通信的基本步骤如下: 1. **服务器端设置**:在Node.js项目中,导入`socket.io`...
本项目是一款轻量级推送服务及实时在线监控平台源码,采用Node.js和socket.io技术构建,支持跨平台访问,包括Web、Android及iOS客户端。该平台具备移动端离线推送功能,并支持大规模集群部署,适用于构建高效、实时...
在Node.js中使用Socket.IO实现聊天室的步骤大致如下: 1. 首先,需要在Node.js应用中安装Socket.IO库。这可以通过npm(Node.js的包管理器)完成,运行命令`npm install socket.io`安装Socket.IO。 2. 创建一个HTTP...
在聊天应用中,Socket.io允许双向通信,即服务器和客户端可以实时交换数据,实现消息的即时推送,确保聊天的实时性。 4. **MongoDB**: MongoDB是一个基于分布式文件存储的开源文档数据库系统。它使用JSON格式的文档...
在点对点随机匹配聊天的上下文中,我们可以将Node.js和Socket.IO结合,用Node.js作为后端运行环境,Socket.IO用来处理实时通信,使得客户端之间可以建立实时的长连接,并进行消息的发送与接收。 在实现点对点随机...
在标题“消息推送socket.io”中,我们主要关注的是如何使用Socket.IO来实现消息推送功能。 在描述中提到,“使用服务端脚本,Node.js应用组件”,这表明我们将使用Node.js作为后端服务器,并结合Socket.IO库来创建...
2. Socket.IO:这个模块实现了实时、双向通信,使得Node.js应用可以实现实时推送功能,广泛应用于聊天应用、协作工具和在线游戏等场景。 3. Mongoose:Mongoose是MongoDB的ORM(对象关系映射)库,简化了数据库操作...
在Node.js中使用Socket.IO,可以让开发者轻松地实现浏览器与服务器之间的低延迟、高效的数据传输。 首先,我们来详细解释一下标题"node使用socket.io通过浏览器通信"所涉及的知识点: 1. **Node.js**: Node.js是一...
在本文中,我们将深入探讨如何使用JavaScript、socket.io、WebRTC、Node.js和Express搭建一个简易版的远程视频聊天应用。这些技术都是现代Web开发中的关键组件,它们各自扮演着不同的角色,共同构建出实时、低延迟的...
"基于node的socket.io轻量级推送服务和实时在线监控平台"是一个专为此目的设计的解决方案,它允许开发者轻松实现双向实时通信,不仅适用于Web端,还支持Android和iOS移动设备。下面将详细探讨这一技术栈的关键知识点...
标题中的“Node.js-react16nodemongodb实时聊天webapp”揭示了这个项目是使用Node.js、React 16和MongoDB这三个核心技术构建的一个实时聊天应用程序。在这个项目中,Node.js作为后端服务器,React 16作为前端框架,...
《使用Node.js与Socket.IO构建实时扑克游戏》 在当今的Web开发领域,实时交互功能已经成为了一种不可或缺的需求。Node.js作为JavaScript运行时环境,以其异步非阻塞I/O和事件驱动的特性,为构建实时应用提供了强大...
Socket.IO是一个广泛使用的JavaScript库,专门用于开发实时Web应用程序。它允许开发者在客户端(浏览器)与服务器端之间建立实时双向通信,对于即时通讯、推送通知、协作应用程序、在线游戏等多种应用场景尤其有用。...
从上述内容可知,Node.js结合Socket.IO能够极大地简化即时通讯应用的开发流程,通过一系列的事件和API,开发者可以轻松实现包括用户连接与断开的监听、消息的发送接收以及各种数据的实时处理。 以一个简单的例子来...
这依赖于Socket.io的实时推送机制,当一方发送消息时,另一方可以立即收到,无需刷新页面。 4. **前端开发**:虽然没有明确指出,但前端通常会使用HTML、CSS和JavaScript(可能包括React、Vue或Angular等现代框架)...
"Node-chat"项目是一个利用Node.js和Socket.IO技术创建的在线聊天应用,它展示了如何利用这两种强大的工具实现即时、双向的数据传输,从而实现用户间的实时交流。 【Node.js】 Node.js是一个基于Chrome V8引擎的...
- 通过这个Demo,你可以了解Node.js、Socket.IO和MySQL的基本用法,以及它们如何协同工作实现实时数据交换和存储。 - 可以根据需求扩展功能,例如增加用户认证、错误处理和日志记录等。 总之,“Nodejs Socket IO...
在实际开发中,这种特性使得Node.js特别适合构建高并发、实时的网络应用,如聊天服务器、实时数据推送等。 视频教程可能涵盖以下知识点: 1. **安装与环境配置**:讲解如何在不同操作系统上安装Node.js,设置环境...