您的位置:首页 > 数据库 > Redis

nodejs+socketio+redis的一些小尝试

2014-11-23 11:22 288 查看
October 15, 2011 
Leave a comment
http://www.dcshi.com/?p=21
nodejs全异步的特点正的非常适合做聊天室,或者基于BS架构的即时通讯类的产品的开发

nodejs的详细介绍见:http://nodejs.org/

socket.io:众所周知现在html5火,html5的新特性包括本地存储,geo,webscoket等

那socket.io有什么关系?答案是没有关系。

socket.io分server&client两部分,基于socket.io就可以完成一个简单的聊天室。socket.io是对client端的连接方式进行了封装,而且提供了很多强大的特性,如触发事件等

由于不是所有的browser都支持webscoket,所以socket.io封装了以下几种连接模式,按优先级来决定采用哪种连接方式

['websocket', 'server-events', 'flashsocket', 'htmlfile', 'xhr-multipart', 'xhr-polling']

详细介绍就按:http://socket.io

redis,redis是一个高效的内存key-val存储系统,这里更多的是采用redis的pub/sub特性

详细见redis.io

我主要是打算利用三者做一个基于BS架构的实时监控系统(如果你有兴趣,可以延伸成其他任何的实时系统,不只是监控,例如用户的实时行为监控系统?非常有趣)

code for server:

var redis = require(‘redis’),

settings = require(‘./settings’),

parser = require(‘./parser’),

helpers = require(‘./helpers’);

subscriptionPattern = ‘channel:*’,

io = require(’socket.io’);

var app = settings.app;

app.listen(settings.appPort);

var server = io.listen(app);

helpers.debug(‘Server running at http://127.0.0.1:’+settings.appPort);
app.get(‘/’, function(request, response){

response.render(‘index’, {

title: ‘test’,

address: ‘http://192.168.39.2′,

port: 1313

});

});

var redisClient = redis.createClient(settings.REDIS_PORT, settings.REDIS_HOST);

server.sockets.on(‘connection’, function (socket) {

socket.on(’subscribe’,function(channel)

{

helpers.debug(‘join channel: ‘+channel);

socket.join(channel);

socket.send(’subscribe OK’);

});

socket.on(‘unsubscribe’,function(channel)

{

helpers.debug(‘leave channel: ‘+channel);

socket.leave(channel);

socket.send(‘unsubscribe OK’);

});

});

redisClient.psubscribe(subscriptionPattern);

redisClient.on(‘pmessage’,function(pattern, channel, message){

var channelName = ”;

helpers.debug(‘pattern: ‘+pattern);

if(pattern == subscriptionPattern)

{

try

{

channelName = channel.split(‘:’)[1].replace(/-/g, ‘ ‘);

}

catch(e){return;}

}

helpers.debug(‘message:\n ‘+message);

server.store.clients(channelName,function(clients){

helpers.debug(‘channel: ‘+channelName);

clients.forEach(function(id){

helpers.debug(‘client id: ‘+id);

var packet = {

type: ‘message’,

data: message

};

packet = parser.encodePacket(packet)

server.store.client(id).publish(packet);

});

})

});

code for client:

script(src=’./socket.io/socket.io.js’)

script(src=’http://staging.tokbox.com/v0.91/js/TB.min.js’)

script(src=’./javascripts/app.js’)

var socket = io.connect(‘htpp://serverip:port’);

socket.emit(“subscribe”,”channel-test”);

socket.on(‘message’, function (data) {

console.log(data);

});

上面只提供了一个实现思想,有兴趣的同学自己琢磨下吧

详细代码见:
https://github.com/downloads/dcshi/node-realtime-framework/nodejs_socket.io_redis.tar
 

Posted in nodejs
Tagged nodejs
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: