Отключение всех пользователей комнаты, когда «Хост» отключается в Socket.IO - PullRequest
3 голосов
/ 22 марта 2012

В настоящее время у меня есть инициатор комнаты, помеченный как «Хозяин». Мне нужно настроить его так, чтобы, если «Хост» нажимал ссылку «Закрыть комнату», он отключал всех пользователей от идентификатора этой комнаты.

Как я могу получить всех пользователей из socket.manager.roomClients или чего-то в этом роде, пройти через них всех и запустить какой-нибудь тип socket.leave( room_id ), если номер_хоста "Host's" совпадает с ключом в диспетчере сокетов?

Спасибо за понимание или помощь. Дайте мне знать, если мне нужно что-то уточнить.

Ответы [ 4 ]

7 голосов
/ 22 марта 2012

Механизм для этого в socket.io отсутствует, но реализовать его самостоятельно не так уж сложно. Вы просто перебираете каждый сокет в комнате и вызываете метод отсоединения. В идеале это будет метод уровня io.sockets, но вы должны знать пространство имен, которое использует сокет, поэтому я добавил прототип на уровне сокета, чтобы загрузить всех из комнаты. Взгляните на следующее:

var sio = require('socket.io');
var io = sio.listen(app);

sio.Socket.prototype.disconnectRoom = function (name) {
    var nsp = this.namespace.name
    , name = (nsp + '/') + name;

    var users = this.manager.rooms[name];

    for(var i = 0; i < users.length; i++) {
        io.sockets.socket(users[i]).disconnect();
    }

    return this;
};

Вы можете использовать его, как показано ниже.

socket.on('hostdisconnect', function() {
    socket.disconnectRoom('roomName');
});

Предупреждение: если вы собираетесь использовать что-то подобное, важно знать, что оно использует внутренние структуры данных, которые могут присутствовать или не присутствовать в следующей версии socket.io. Обновление socket.io может нарушить эту функцию.

0 голосов
/ 21 июля 2018

Вот как мне удалось добиться этого в socket.io "version": "2.1.1":

function disconnectRoom(room: string, namespace = '/') {
   io.of(namespace).in(room).clients((err, clients) => {
      clients.forEach(clientId => this.io.sockets.connected[clientId].disconnect());
   });
}
0 голосов
/ 17 апреля 2015

Последнее обновление в socket.io - это метод выхода () в качестве дополнения к join ().

Например,

    socket.join('room1');
    socket.leave('room1');

Может быть, это поможет вам в вашем сценарии.

0 голосов
/ 22 марта 2012

После долгой борьбы с попытками сделать это через socket.io я нашел способ заставить комнату быть убитым через Node.JS / Express

app.get('/disconnect', function(req, res){
  console.log("Disconnecting Room " + req.session.room_id);
  req.session.destroy(function(err){
    if (err){
      console.log('Error destroying room... ' + err);
    } else{
      res.redirect('/');
    }
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...