Частные каналы в node.js и redis. Как?
Я написал простой скрипт (app.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 connect и затем получить их на сервере. Если я ошибаюсь, кто-то поправляет меня. Я не могу найти это нигде в документации по 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);
});
});
});
Нет необходимости делать это, так как вы будете дублировать функциональность. С 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 и сессиях.