Присоединение к одной и той же комнате более одного раза и клиентов в комнате

Я пытаюсь выяснить, что произойдет, если клиенты излучают, чтобы присоединиться к одной и той же комнате более одного раза. Чтобы проверить и найти ответ на этот вопрос, я изначально хотел выяснить, сколько клиентских комнат имеет после того, как одни и те же клиенты отправят более одного излучения для присоединения комната, но глава Rooms в вики https://github.com/Automattic/socket.io/wiki/Rooms устарели. Когда я пытаюсь использовать "io.sockets.clients('room')", я получаю сообщение об ошибке "Объект № не имеет метода "клиенты"".

Итак, у меня есть два вопроса: 1. что произойдет, если клиент попытается присоединиться к одной и той же комнате более одного раза? Будет ли он получать эмиссию для этой комнаты каждый раз, когда он пытался присоединиться? 2. Как я могу узнать, какие клиенты находятся в комнате?

Я использую socket.io v1.0.2


person Ismar Slomic    schedule 29.05.2014    source источник


Ответы (3)


Я получил ответ на этот вопрос на socket.io github.

  1. Согласно этой строке кода, сокет будет получать выбросы только один раз. Розетка добавляется в комнату только один раз, и если будет предпринята еще одна попытка для той же розетки присоединиться к комнате, эта попытка будет проигнорирована.

  2. В настоящее время нет общедоступного API для получения клиентов, и некоторые обсуждения продолжаются в #1428< /а>. Если вам действительно нужно их получить, по какой-то причине вы можете получить фактических клиентов из адаптера, предполагая, что вы не используете адаптер Redis следующим образом:

    socket.join('test room');
    var clients = io.sockets.adapter.rooms['test room'];
    console.log(clients);
    for (var clientId in clients) {
      console.log(io.sockets.connected[clientId]);
    }
    
person Ismar Slomic    schedule 29.05.2014
comment
+1 за то, что не смог собрать клиентов в комнате. В итоге я сделал то же исправление, которое вы предложили в № 2 вашего ответа. - person Alexis; 03.06.2014
comment
Это игнорирование было в Socket.io 0.9 или это новое в 1.0? Потому что мне нравится идея игнорирования, если пользователь уже присоединился к комнате. - person Maziyar; 12.06.2014
comment
В v1.3.5 клиенты не определены. - person Loolooii; 21.06.2015
comment
Приятно знать, что розетка может подключаться только к 1 комнате, я просто тестировал ее в проекте. Спасибо за предоставленный фрагмент кода! - person Nick Kenens; 23.06.2016
comment
@NickKenens - Нет, розетка может подключаться к нескольким комнатам. Ответ предполагает, что «излучение» будет выполнено только один раз, независимо от нескольких попыток присоединиться к одной и той же комнате. - person EmeraldTablet; 10.08.2017

Исправлено получение клиентов в комнате на socket.io ~1.4.5 следующим образом:

    socket.join('test room');
    var room = io.sockets.adapter.rooms['test room'];
    console.log(room);
    for (var socketId in room.sockets) {
      console.log(io.sockets.connected[socketId]);
    }
person Tola    schedule 05.04.2016

Он работает нормально и не выдает никаких ошибок, он игнорирует второй запрос на присоединение к комнате с того сокета, который уже есть в комнате.

На самом деле я попробовал и реализовал решение, в котором, когда пользователь нажимает на уведомление о сообщении, он присоединяется к той конкретной комнате, из которой пришло уведомление, и, когда он отправляет самое первое сообщение, он снова присоединяется к этой конкретной комнате (это потому, что я создал чат- директива в AngularJS).

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

1) Уведомление об открытии пользователем

Socket.emit('JoinRoomWithThsID', notification.ConversationID);

2) пользователь отправляет первое сообщение в этой комнате

Socket.emit('patientChatRoomMessage', adminmessage);
person Junaid Yousaf Lodhi    schedule 09.08.2018