Node.js, какой пользователь должен быть уведомлен

Я построил систему уведомлений на своем сайте. У меня есть какие-то группы членов. Когда участник группы публикует что-либо, другие участники той же группы должны быть уведомлены. Уведомления появляются, когда пользователь обновляет страницу. Однако мир движется в реальном времени. Google порекомендовал мне Node.js (не уверен, что это лучший способ). Теперь я могу: создать сервер, подключиться к базе данных, запросить базу данных, отправить широковещательные сообщения с использованием socket.io всем подключенным клиентам...
Но чего я пока не могу сделать/понять, так это указать, к какому пользователь (ы), сообщение (уведомление) должно быть доставлено.
Оглядываясь вокруг, SO приходит к следующему способу, который выглядит так, как я хочу:

var socket = io.listen(server);
socket.on('connection', function(client) {
  client.on('message', function(msg) {
    broadcast(msg); // broadcast message to all clients
    // OR
    socket.clients[session_id].send(msg); // send message to one client
  });

  client.on('disconnect', function( ) {
    console.log('Client Disconnected.');
  });
});

Я не знаю, что такое session_id, это то же самое, что session_id пользователя, созданного при входе в систему? Действительно устал искать какие-то прямые решения, любая помощь будет высоко оценена.


person Nadjib Mami    schedule 16.08.2012    source источник
comment
См. этот вопрос: stackoverflow.com/q/11356001/362536   -  person Brad    schedule 16.08.2012
comment
Обратите внимание, что группа может содержать сотни пользователей. Это действительно как личное сообщение? В любом случае спасибо, разберусь.   -  person Nadjib Mami    schedule 16.08.2012
comment
Да, процесс отправки сообщения тот же.   -  person Brad    schedule 16.08.2012
comment
Вероятно, стоит прочитать о шаблоне en.wikipedia.org/wiki/Publish_subscribe "публикация-подписка". .   -  person ebohlman    schedule 17.08.2012
comment
Пойми это. Спасибо Эболман.   -  person Nadjib Mami    schedule 17.08.2012
comment
Любопытно узнать.. но что вы в итоге использовали? Так как вы не указали ответ.   -  person Vincent Cohen    schedule 10.11.2013


Ответы (3)


Создавайте комнаты, несколько клиентов могут быть частью нескольких комнат, а клиенты в комнате могут транслировать сообщения всем остальным участникам комнаты.

Предполагая, что в вашем сообщении есть имя комнаты и тело данных

socket.on('connection', function(client) {
    client.on('message', function(msg) {
        // broadcast message to all clients
        io.sockets.in(msg.room).emit(msg.data);
        // OR
        socket.clients[session_id].send(msg); // send message to one client
    });

    client.on('disconnect', function( ) {
        console.log('Client Disconnected.');
    });
});

https://github.com/LearnBoost/socket.io Здесь должно быть несколько примеров

http://psitsmike.com/2011/10/node-js-and-socket-io-multiroom-chat-tutorial/ Это хороший вариант

person Rishi Diwan    schedule 16.08.2012
comment
Я посетил этот пост, конечно. Я еще раз перепроверю. Спасибо Риши. - person Nadjib Mami; 16.08.2012

Вот пример из документации socket.io:

Хранение данных, связанных с клиентом

Иногда необходимо хранить данные, связанные с клиентом, которые необходимы на время сеанса.

На стороне сервера

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

io.sockets.on('connection', function (socket) {
  socket.on('set nickname', function (name) {
    socket.set('nickname', name, function () { socket.emit('ready'); });
  });

  socket.on('msg', function () {
    socket.get('nickname', function (err, name) {
      console.log('Chat message by ', name);
    });
  });
});

Клиентская сторона

<script>
  var socket = io.connect('http://localhost');

  socket.on('connect', function () {
    socket.emit('set nickname', prompt('What is your nickname?'));
    socket.on('ready', function () {
      console.log('Connected !');
      socket.emit('msg', prompt('What is your message?'));
    });
  });
</script>
person devmiles.com    schedule 16.08.2012
comment
Выглядит интересно, я попробую это и отвечу, дорогая. Спасибо. - person Nadjib Mami; 16.08.2012

Socket.IO очень прост в использовании.
Посмотрите документ здесь: https://github.com/learnboost/socket.io/

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');
});
person 3on    schedule 16.08.2012
comment
Конечно раньше пользовался. Моя проблема заключается в том, чтобы отправлять сообщения конкретным пользователям одной группы. И пользователи, и группы идентифицируются по идентификатору. - person Nadjib Mami; 16.08.2012