nodejs+socketio+redis的一些小尝试

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

 

你可能感兴趣的:(nodejs+socketio+redis的一些小尝试)