2011-12-16 61 views
0

我寫了簡單的腳本(app.js)認購Redis的通道node.js和redis中的專用頻道。如何?

var app = require('express').createServer() 
, io = require('socket.io').listen(app); 

var redis = require("redis"); 

app.listen(8080); 

////////////// Dev environment; replace by PERL in production use. 
app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 
////////////// 

io.sockets.on('connection', function (socket) { 
    socket.subscribe = redis.createClient(); 
    socket.subscribe.subscribe('chat'); 

    socket.subscribe.on("message", function(channel, message) { 
     socket.send(message); 
    }); 

    socket.on('disconnect', function() { 
     socket.subscribe.quit(); 
    }); 

    socket.on('close', function() { 
     socket.subscribe.quit(); 
    }); 
}); 

現在,我要讓可能認購爲每個用戶專用通道。

我試圖通過socket.io.connect通過額外的數據是這樣的:

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:8080', {'PRIVATE_ROOM_HASH': 'secret_hash'}); 
    socket.on('message', function (data) { 
    console.log(data); 
    }); 
</script> 

,然後在app.js

... 
io.sockets.on('connection', function (socket, args) { 
    socket.subscribe = redis.createClient(); 
    socket.subscribe.subscribe(args.PRIVATE_ROOM_HASH); 

    socket.subscribe.on("message", function(channel, message) { 
     socket.send(message); 
    }); 

,但它不工作。

任何想法如何解決私人房間的問題?

謝謝。

回答

2

我不認爲你可以傳遞額外的參數到socket.io連接命令,然後讓他們在服務器中。如果我錯了,有人糾正我。我無法在socket.io文檔中的任何位置找到它。

無論如何,socket.io已經內置了對房間的支持。在客戶端,你將例如發送join事件到服務器房間

var socket = io.connect('http://localhost:8080'); 
socket.on('connect', function() { 
    socket.emit('join', 'secret_hash'); 
}); 

socket.on('message', function(msg) { 
    // got a messae! 
}); 

的名稱,並在服務器上,你會使用客房都配備。

io.sockets.on('connection', function(socket) { 
    socket.on('join', function(room) { 
    socket.join(room); 
    socket.on('message', function(msg) { 
     socket.broadcast.to(room).emit('message', msg); 
    }); 
    }); 
}); 
+0

謝謝DeaDEnD!我認爲這是一個很好的解決方案。無論如何,我不會使用socket.join和socket.broadcast,因爲我在應用程序的其他部分也使用Redis(例如,在Perl的代碼中),所以我將留在redis.createClient() – User 2011-12-17 09:47:16

0

沒有必要這樣做,因爲您會複製功能。隨着Socket.IO可以使客戶端加入房間,像他們的GitHub的網頁上描述:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.join('justin bieber fans'); 
    socket.broadcast.to('justin bieber fans').emit('new fan'); 
    io.sockets.in('rammstein fans').emit('new non-fan'); 
}); 

此外,如果你想真正的權威性,最好將與會話,我建議你讀條關於Express, Socket.IO and sessions