Возможно ли прослушивание для входа и выхода из комнаты?

Я хочу сделать что-то вроде:

var room = io.sockets.in('some super awesome room');
room.on('join', function () {
    /* stuff */
});
room.on('leave', function () {
    /* stuff */
});

Это не работает. Возможно ли это?

Чтобы проиллюстрировать желаемое поведение:

io.sockets.on('connection', function (socket) {
    socket.join('some super awesome room'); // should fire the above 'join' event
});

Ответ 1

В Socket.IO "комната" на самом деле просто пространство имен, что-то, что поможет вам отфильтровать ваш гигантский пакет сокетов до меньшего пакета сокетов. Вызов io.sockets.in('room').on('something') приведет к срабатыванию обработчика события для каждого сокета в комнате при срабатывании события. Если это то, что вы хотите, что-то вроде этого должно сделать трюк:

var room = io.sockets.in('some super awesome room');
room.on('join', function() {
  console.log("Someone joined the room.");
});
room.on('leave', function() {
  console.log("Someone left the room.");
});

socket.join('some super awesome room');
socket.broadcast.to('some super awesome room').emit('join');

setTimeout(function() {
  socket.leave('some super awesome room');
  io.sockets.in('some super awesome room').emit('leave');
}, 10 * 1000);

Важно отметить, что вы получите тот же эффект, если вы (1) получили список всех сокетов в комнате и (2) повторили их, набрав emit('join') для каждого. Таким образом, вы должны убедиться, что ваше имя события достаточно конкретное, чтобы вы случайно не выбрали его вне "пространства имен" комнаты.

Если вы хотите только излучать/потреблять одно событие, когда сокет соединяется или выходит из комнаты, вам нужно будет написать это сами, так как снова комната не является "вещью", "фильтр".

Ответ 2

Вы можете использовать собственное событие "disconnect".

socket.on('disconnect', function () {

        io.sockets.emit('user disconnected');
    });

Ответ 3

Я понимаю, что этот вопрос старый, но для тех, кто наткнулся на это с помощью поиска в Google, я так и подхожу к нему.

Присоединение к комнате - это то, что довольно легко учесть, хотя для присоединения или выхода из комнаты нет родных событий.

/* client.js */
var socket = io();
socket.on('connect', function () {
    // Join a room
    socket.emit('joinRoom', "random-room");
});

И для серверной стороны

/* server.js */
// This will have the socket join the room and then broadcast 
// to all sockets in the room that someone has joined
socket.on("joinRoom", function (roomName) {
    socket.join(roomName);
    io.sockets.in(roomName).emit('message','Someone joined the room');
}

// This will have the rooms the current socket is a member of
// the "disconnect" event is after tear-down, so socket.rooms would already be empty
// so we're using disconnecting, which is before tear-down of sockets
socket.on("disconnecting", function () {
    var rooms = socket.rooms;
    console.log(rooms);
    // You can loop through your rooms and emit an action here of leaving
});

Там, где это становится немного сложнее, когда они отключаются, но, к счастью, было добавлено событие disconnecting, которое происходит до разрыва сокетов в комнате. В приведенном выше примере, если событие было disconnect, тогда комнаты были бы пустыми, но disconnecting будут иметь все комнаты, к которым они принадлежат. Для нашего примера у вас будет две комнаты, в которые будет входить сокет, Socket#id и random-room

Я надеюсь, что это указывает на кого-то в правильном направлении из моих исследований и тестирования.