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

Socket.io: Пространства имен, каналы & co

У меня есть веб-сервер Node.js, который запускает сервер сокетов сверху, который был создан с помощью Socket.io. В принципе, это работает.

Теперь я хочу достичь того, что клиенты, которые подключаются, группируются в группы. Таким образом, могут быть некоторые клиенты, которые составляют группу A и некоторые другие клиенты, которые составляют группу B. Они должны выбрать, к какой группе они принадлежат, перейдя по определенному URL-адресу: localhost:3000/A или localhost:3000/B.

В Socket.io Теперь я хочу отправлять сообщения всем клиентам в группе A или ко всем клиентам группы B или ко всем клиентам, не глядя на их группу.

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

Каков наилучший способ создания такой системы с помощью Socket.io?

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

Как мне это моделировать? Какие правильные условия я должен искать?

ОБНОВЛЕНИЕ: В соответствии с ответом @sdedelbrock я мог бы использовать пространство имен или комнаты:

  • Если использовать пространства имен, я не могу долго отправлять их всем независимо от их пространства имен. Это связано с тем, что io.sockets является ярлыком для io.of(''), который, конечно, больше не соответствует пространству имен.
  • Это означает, что я должен использовать комнаты, но мне интересно, что такое семантическая разница между комнатой и пространством имен.

Сократить это: почему существуют две концепции для одной и той же (?) идеи?

4b9b3361

Ответ 1

Вы можете использовать комнаты, чтобы вы делали следующее, чтобы излучать всех в комнате

io.sockets.in('a').emit('inA', 'foo')

Затем, чтобы испустить всех, вы можете использовать

io.sockets.emit('everyone','bar');

Вы также можете использовать пространства имен:

io.of('/b').emit('inB', 'buzz');

Чтобы выдать все, кроме пользователя, который вызвал, вы будете использовать:

io.sockets.broadcast.emit("hello");

[edit] Вот более подробный ответ:

Идея разделения имен заключается в том, что она обрабатывается отдельно от других пространств имен (даже глобальных). Подумайте об этом, как если бы это был совершенно новый экземпляр socket.io, вы можете запускать новые рукопожатия, свежие события, авторизации и т.д., Не вмешиваясь друг в друга в разных пространствах имен.

Это было бы полезно для say /chat и /tracking, где событие соединения будет иметь очень различную логику

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

Возможно, возникло обходное решение, в котором вы можете транслировать все пространства имен (пример ниже). Однако, короче говоря, вы не должны этого делать, вы должны использовать комнаты.

for (var nameSpace in io.sockets.manager.namespaces){
  io.of(nameSpace).emit("messageToAll", message);
}

Ответ 2

Это приложение шаблона, которое вы можете использовать (работает для 9.16, не проверено на 1.x, но оно должно работать):

var namespaces = [
    io.of('/ns1'),
    io.of('/ns2'),
    io.of('/ns3')
];

for (i in namespaces) {
    namespaces[i].on('connection',handleConnection(namespaces[i]));  
}

function handleConnection(ns) {
   return function (socket){ //connection
   console.log("connected ");
   socket.on('setUsername',setUsernameCallback(socket,ns));                       
   socket.on('disconnect', disconnectCallback(socket,ns));                        
   socket.on('messageChat',messageChatCallback(socket,ns));
   socket.on('createJoinRoom',createJoinRoomCallback(socket,ns));  

  };
}

function disconnectCallback(socket,ns) {
    return function(msg){
    console.log("Disconnected ");
    socket.broadcast.send("It works!");
  };
}

Вы можете написать другие дескрипторы самостоятельно:)