Частные каналы в node.js и redis.Как? - PullRequest
0 голосов
/ 17 декабря 2011

Я написал простой скрипт (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();
    });
});

Теперь я хочу сделать возможным подписку на частный канал для каждого пользователя.

Iпопытался передать дополнительные данные через 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 ]

2 голосов
/ 17 декабря 2011

Я не думаю, что вы можете передать дополнительные аргументы команде 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);
    });
  });
});
0 голосов
/ 17 декабря 2011

Нет необходимости делать это, так как вы будете дублировать функциональность. С помощью 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 и сеансах .

...