комнаты socket.io или пространство имен?

163

Я исследую nodejs / socket.io для чата в реальном времени, и мне нужен совет для реализации комнат.

Что лучше: использовать пространство имен или функцию помещения, чтобы полностью изолировать группы участников чата друг от друга?

Какова реальная техническая разница между комнатами и пространством имен?

Есть ли разница в использовании ресурсов?

Джозеф
источник

Ответы:

216

Вот что общего между пространствами имен и комнатами (socket.io v0.9.8 - обратите внимание, что v1.0 включал полную переписку, поэтому все могло измениться):

  • Оба пространства имен ( io.of ('/ nsp') ) и комнаты ( socket.join ('room') ) создаются на стороне сервера
  • Несколько пространств имен и несколько комнат используют одно и то же соединение (WebSocket)
  • Сервер будет передавать сообщения по проводам только тем клиентам, которые подключились к nsp / комнате или присоединились к ней, т.е. это не просто фильтрация на стороне клиента

Эти различия :

  • пространства имен подключаются клиентом с помощью io.connect(urlAndNsp)(клиент будет добавлен в это пространство имен, только если оно уже существует на сервере)
  • комнаты могут быть объединены только на стороне сервера (хотя создание API на стороне сервера, чтобы позволить клиентам присоединяться, довольно просто)
  • пространства имен могут быть защищены авторизацией
  • авторизация недоступна для комнат , но пользовательская авторизация может быть добавлена ​​к вышеупомянутому простому в создании API на сервере, в случае, если кто-то захочет использовать комнаты
  • комнаты являются частью пространства имен (по умолчанию используется глобальное пространство имен)
  • пространства имен всегда коренятся в глобальной области видимости

Чтобы не путать концепцию с именем (комната или пространство имен), я буду использовать аргумент для обозначения концепции и два других имени для реализации концепции. Так что если вы

  • требуется авторизация для каждого отделения , пространства имен могут быть самым простым путем
  • если вы хотите иерархически слоистые отсеки (максимум 2 слоя), используйте комбинацию пространства имен / комнаты
  • если ваше клиентское приложение состоит из разных частей, которые (сами не заботятся о отсеках, но) необходимо отделить друг от друга, используйте пространства имен.

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

На самом деле, не оценив это, мне кажется, что если вам нужны простые разделы в вашем проекте для разделения и группировки сообщений, то и то и другое хорошо.

Не уверен, что это отвечает на ваш вопрос, но исследования, приведшие к этому ответу, по крайней мере, помогли мне увидеть яснее.

Евгений Бересовский
источник
5
Что-то изменилось после версии socket.io> = 1.0?
Ксероксоид
2
Изменения в последней версии, прочитайте socket.io/docs/rooms-and-namespaces, и этот ответ может быть полезен для понимания вещей в комнатах stackoverflow.com/questions/24041220/…
Gonzalo Bahamondez
1
Можем ли мы сказать, что пространство имен - это определенная область моего веб-приложения, и разместить группу клиентов в этой области?
Onaiggac
Можете ли вы добавить что-то о при отключении от комнаты / пространства имен. Что происходит с ними, когда клиент временно отключается или теряет соединение? Вот что написано: При отключении сокеты автоматически покидают все каналы, частью которых они были, и с вашей стороны не требуется никаких специальных действий. Является ли канал так же , как ваш отсек ?
Уил
67

Это старый вопрос, но после некоторого исследования по этой теме я обнаружил, что принятый ответ не ясен по важному вопросу. По словам самого Гильермо Рауха ( см. Ссылку ): хотя теоретически возможно динамически создавать пространства имен в работающем приложении, вы используете их главным образом как предопределенные отдельные разделы вашего приложения. Если, с другой стороны, вам нужно на лету создавать специальные отсеки для размещения групп пользователей / соединений, лучше всего использовать комнаты.

Хулио Гарсия
источник
3
Нравится это! Пространства имен - предопределенные соединения. Номера - Динамические соединения
Nandakumar
16

Это зависит от того, что ты хочешь сделать.

Основное отличие состоит в том, что комнаты сложнее реализовать. Вы должны создать метод для объединения комнат с каждой перезагрузкой страницы.

С пространствами имен вам просто нужно написать var example = io.connect('http://localhost/example');в своем клиенте javascript, и клиент автоматически добавится в пространства имен.

Пример использования:

  • комнаты: приватный чат.
  • Пространства имен: чат страницы.

источник
2

Комнаты и пространства имен сегментируют связь и группируют индивидуальные розетки.

Трансляция в комнату или в пространство имен не сможет охватить всех, кроме участников.

Разница между пространствами имен и комнатами заключается в следующем:

  • Пространства имен: управляются во внешнем интерфейсе, что означает, что пользователь или злоумышленник присоединяется через внешний интерфейс, и здесь осуществляется управление присоединением и отключением.
  • Комнаты: управляются в бэкэнде, то есть сервер назначает присоединяющиеся и покидающие комнаты.

Разница главным образом в том, кто ими управляет

Чтобы решить, что использовать, вы должны решить, следует ли управлять сегментацией во внешнем интерфейсе или во внутреннем интерфейсе.

zardilior
источник
0

Пространства имен позволяют вам создавать объекты с одинаковыми именами, но они будут разделены, так как они будут жить в разных пространствах имен, иначе называемых областями.

Это тот же мыслительный процесс, который вы должны использовать с пространствами имен Socket.IO. Если вы создаете модульное веб-приложение Node, вам нужно выделить пространство имен для различных модулей. Если вы посмотрите на наш код пространства имен, то увидите, что мы смогли прослушивать одни и те же точные события в разных пространствах имен. В Socket.IO событие соединения в соединении по умолчанию и событие соединения в пространстве имен / xxx различаются. Например, если у вас есть система чата и комментариев на вашем сайте, и вы хотите, чтобы оба работали в режиме реального времени, вы можете указать пространство имен. Это позволяет создавать целое приложение Socket.IO, которое живет только в своем собственном контексте.

Это также будет верно, если вы собираете что-то для упаковки и установки. Вы не можете знать, использует ли кто-то уже определенные события в пространстве имен по умолчанию, поэтому вы должны создать свое собственное и слушать там. Это позволяет вам не наступать на ноги любому разработчику, который использует ваш пакет.

Пространства имен позволяют нам разделять соединения на разные контексты. Мы можем сравнить это с комнатами, которые позволяют нам группировать соединения. Затем мы можем иметь такое же соединение и для других комнат.

Пространства имен позволяют создавать различные контексты для работы с Socket.IO. Комнаты позволяют группировать клиентские соединения внутри этих контекстов.

faridcs
источник