本文转自:http://www.xiaocai.name/post/cf1f9_7b6507  学习node.js socket.io 使用

用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的更多相关文章

  1. 使用Node.js+Socket.IO搭建WebSocket实时应用【转载】

    原文:http://www.jianshu.com/p/d9b1273a93fd Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新 ...

  2. 使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  3. (转)使用Node.js+Socket.IO搭建WebSocket实时应用

    Web领域的实时推送技术,也被称作Realtime技术.这种技术要达到的目的是让用户不需要刷新浏览器就可以获得实时更新.它有着广泛的应用场景,比如在线聊天室.在线客服系统.评论系统.WebIM等. W ...

  4. 基于node.js+socket.io+html5实现的斗地主游戏(1)概述

    一.游戏描述 说是斗地主游戏,其实是寝室自创的"捉双A",跟很多地方的捉红10.打红A差不多,大概规则是: 1.基础牌型和斗地主一样,但没有大小王,共52张牌,每人13张,这也是为 ...

  5. node.js+socket.io配置详解

    由于我是在win7的环境下,在这里就以win7系统为例进行讲解了. 首先需要在nodejs官网下载最新版的node.js,下载完毕直接安装即可,安装成功后在cmd命令行中执行node指令,如下结果就说 ...

  6. 基于Node.js+socket.IO创建的Web聊天室

    这段时间进了一个新的项目组,项目是用Appcan来做一个跨平台的移动运维系统,其中前台和后台之间本来是打算用WebSocket来实现的,但写好了示例后发现android不支持WebSocket,大为受 ...

  7. node.js + socket.io实现聊天室一

    前段时间,公司打算在社区做一个聊天室.决定让我来做.本小白第一次做聊天类功能,当时还想着通过ajax请求来实现.经过经理提示,说试试当前流行的node.js 和socket.io来做.于是就上网学习研 ...

  8. AngularJS+Node.js+socket.io 开发在线聊天室

    所有文章搬运自我的个人主页:sheilasun.me 不得不说,上手AngularJS比我想象得难多了,把官网提供的PhoneCat例子看完,又跑到慕课网把大漠穷秋的AngularJS实战系列看了一遍 ...

  9. 使用node.js + socket.io + redis实现基本的聊天室场景

    在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对 ...

随机推荐

  1. robotframework笔记18

    测试执行 如何创建测试套件结构解析 执行测试数据,如何继续执行一个测试用例失败后, 以及如何优雅地停止整个测试执行. 执行流 执行测试套件和 总是在一个测试套件执行测试用例. 一个测试套件 创建从一个 ...

  2. 增强Web可用性,你需要避免的七大设计错误

    Web设计给了你展示自我创新才能的平台,同时也要求你特别关注其中的诸多琐碎细节.优秀的Web设计师需要从设计前辈那里获得设计灵感,寻求他们给的建议,并反复推敲,以及付出诸多努力.职业博客作者Rajni ...

  3. poj---(2886)Who Gets the Most Candies?(线段树+数论)

    Who Gets the Most Candies? Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 10373   Acc ...

  4. JavaSE基础之this关键字的引用

    1.0   this 指代当前对象, 在一般方法中可以通过this来引用当前对象的成员(方法,属性). 2.0  通过  this()  调 用重载的构造器,需要注意的是,通过此种方法调用的重载构造器 ...

  5. 229. Majority Element II -- 找出数组中出现次数超过 ⌊ n/3 ⌋ 次的数

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

  6. DataTable常用操作

    添加列和行的三种方法(转载) 原文地址:http://www.cnblogs.com/jRoger/articles/1887581.html DataTable tblDatas =new Data ...

  7. tar.xz如何解压:linux和windows下tar.xz解压命令介绍

    在linux下怎么解压和压缩tar.xz文件? (本文由www.169it.com搜集整理) 在linux下解压tar.xz文件步骤 1 2 # xz -d ***.tar.xz  //先解压xz # ...

  8. Objective-C:Foundation框架-常用类-NSObject

    NSObject是所有类的基类,其常见用法有: #import <Foundation/Foundation.h> @interface Person : NSObject - (void ...

  9. JS模块式开发

    问题:js文件须严格保证加载顺序(比如上例的1.js要在2.js的前面),依赖性最大的模块一定要放到最后加载,当依赖关系很复杂的时候,代码的编写和维护都会变得困难! C语言中模块开发-include ...

  10. linux web php 安全相关设置

    1 隐藏apache 或者 nginx的版本号 2 隐藏php的版本号 3 php 程序做好基本的防注入 xss之类的攻击 4 禁用PHP一些危险的函数 比如 phpinfo.system之类的 5 ...