Подтвердить что ты не робот

Socket.IO подписывается на несколько каналов

Я хочу создать простую систему чатов в верхней части Socket.IO, где пользователь может создать новую комнату для чата, а затем люди могут начать общаться.

Этот звук прост, но как Socket.IO 0.9.4 я запускаю сейчас, после прочтения нескольких сообщений SO вместе с документом на socket.io, я все больше запутался. Итак, я надеюсь, что кто-то может предоставить мне инструкцию, что WORK с 0.9.4:

  • Мне нужен способ подписаться на номер. Имя комнаты выбирается пользователем. Когда сообщение отправляется в комнату, пользователь должен его получить. Как написать код сервера, как написать код клиента?

  • Пользователь может одновременно присоединиться к нескольким комнатам.

  • Я хочу, чтобы другая система отправила сообщение всем пользователям в определенной комнате. Эта "другая система" отправляет сообщение через запрос, обрабатываемый выражением. Как написать этот обработчик запросов?

4b9b3361

Ответ 1

Это все довольно просто с функциями socket.io. Взгляните на документацию по вики LearnBoost.

https://github.com/LearnBoost/socket.io/wiki/Rooms

Он позволяет подключаться к нескольким комнатам по одному разъему. Я собрал быстрый тест со следующим кодом.

Сервер

io.sockets.on('connection', function(socket){
    socket.on('subscribe', function(room) { 
        console.log('joining room', room);
        socket.join(room); 
    })

    socket.on('unsubscribe', function(room) {  
        console.log('leaving room', room);
        socket.leave(room); 
    })

    socket.on('send', function(data) {
        console.log('sending message');
        io.sockets.in(data.room).emit('message', data);
    });
});

Client

 var socket = io.connect();
 socket.on('message', function (data) {
  console.log(data);
 });

 socket.emit('subscribe', 'roomOne');
 socket.emit('subscribe', 'roomTwo');

 $('#send').click(function() {
  var room = $('#room').val(),
   message = $('#message').val();

  socket.emit('send', { room: room, message: message });
 });

Отправка сообщения с экспресс-маршрута также довольно проста.

app.post('/send/:room/', function(req, res) {
    var room = req.params.room
        message = req.body;

    io.sockets.in(room).emit('message', { room: room, message: message });

    res.end('message sent');
});