Вот что общего между пространствами имен и комнатами (socket.io v0.9.8 - обратите внимание, что v1.0 включал полную переписку, поэтому все могло измениться):
Несколько пространств имен и несколько комнат используют одно и то же соединение (WebSocket)
Сервер будет передавать сообщения по проводам только тем клиентам, которые подключились к nsp / комнате или присоединились к ней, т.е. это не просто фильтрация на стороне клиента
Эти различия :
пространства имен подключаются клиентом с помощью io.connect(urlAndNsp)(клиент будет добавлен в это пространство имен, только если оно уже существует на сервере)
комнаты могут быть объединены только на стороне сервера (хотя создание API на стороне сервера, чтобы позволить клиентам присоединяться, довольно просто)
авторизация недоступна для комнат , но пользовательская авторизация может быть добавлена к вышеупомянутому простому в создании API на сервере, в случае, если кто-то захочет использовать комнаты
комнаты являются частью пространства имен (по умолчанию используется глобальное пространство имен)
пространства имен всегда коренятся в глобальной области видимости
Чтобы не путать концепцию с именем (комната или пространство имен), я буду использовать аргумент для обозначения концепции и два других имени для реализации концепции. Так что если вы
требуется авторизация для каждого отделения , пространства имен могут быть самым простым путем
если вы хотите иерархически слоистые отсеки (максимум 2 слоя), используйте комбинацию пространства имен / комнаты
если ваше клиентское приложение состоит из разных частей, которые (сами не заботятся о отсеках, но) необходимо отделить друг от друга, используйте пространства имен.
Примером последнего может служить большое клиентское приложение, в котором различные модули, возможно, разработанные отдельно (например, сторонние), каждый из которых использует socket.io независимо, используются в одном приложении и хотят использовать одно сетевое соединение.
На самом деле, не оценив это, мне кажется, что если вам нужны простые разделы в вашем проекте для разделения и группировки сообщений, то и то и другое хорошо.
Не уверен, что это отвечает на ваш вопрос, но исследования, приведшие к этому ответу, по крайней мере, помогли мне увидеть яснее.
Можем ли мы сказать, что пространство имен - это определенная область моего веб-приложения, и разместить группу клиентов в этой области?
Onaiggac
Можете ли вы добавить что-то о при отключении от комнаты / пространства имен. Что происходит с ними, когда клиент временно отключается или теряет соединение? Вот что написано: При отключении сокеты автоматически покидают все каналы, частью которых они были, и с вашей стороны не требуется никаких специальных действий. Является ли канал так же , как ваш отсек ?
Уил
67
Это старый вопрос, но после некоторого исследования по этой теме я обнаружил, что принятый ответ не ясен по важному вопросу. По словам самого Гильермо Рауха ( см. Ссылку ): хотя теоретически возможно динамически создавать пространства имен в работающем приложении, вы используете их главным образом как предопределенные отдельные разделы вашего приложения. Если, с другой стороны, вам нужно на лету создавать специальные отсеки для размещения групп пользователей / соединений, лучше всего использовать комнаты.
Нравится это! Пространства имен - предопределенные соединения. Номера - Динамические соединения
Nandakumar
16
Это зависит от того, что ты хочешь сделать.
Основное отличие состоит в том, что комнаты сложнее реализовать. Вы должны создать метод для объединения комнат с каждой перезагрузкой страницы.
С пространствами имен вам просто нужно написать var example = io.connect('http://localhost/example');в своем клиенте javascript, и клиент автоматически добавится в пространства имен.
Комнаты и пространства имен сегментируют связь и группируют индивидуальные розетки.
Трансляция в комнату или в пространство имен не сможет охватить всех, кроме участников.
Разница между пространствами имен и комнатами заключается в следующем:
Пространства имен: управляются во внешнем интерфейсе, что означает, что пользователь или злоумышленник присоединяется через внешний интерфейс, и здесь осуществляется управление присоединением и отключением.
Комнаты: управляются в бэкэнде, то есть сервер назначает присоединяющиеся и покидающие комнаты.
Разница главным образом в том, кто ими управляет
Чтобы решить, что использовать, вы должны решить, следует ли управлять сегментацией во внешнем интерфейсе или во внутреннем интерфейсе.
Пространства имен позволяют вам создавать объекты с одинаковыми именами, но они будут разделены, так как они будут жить в разных пространствах имен, иначе называемых областями.
Это тот же мыслительный процесс, который вы должны использовать с пространствами имен Socket.IO. Если вы создаете модульное веб-приложение Node, вам нужно выделить пространство имен для различных модулей. Если вы посмотрите на наш код пространства имен, то увидите, что мы смогли прослушивать одни и те же точные события в разных пространствах имен. В Socket.IO событие соединения в соединении по умолчанию и событие соединения в пространстве имен / xxx различаются. Например, если у вас есть система чата и комментариев на вашем сайте, и вы хотите, чтобы оба работали в режиме реального времени, вы можете указать пространство имен. Это позволяет создавать целое приложение Socket.IO, которое живет только в своем собственном контексте.
Это также будет верно, если вы собираете что-то для упаковки и установки. Вы не можете знать, использует ли кто-то уже определенные события в пространстве имен по умолчанию, поэтому вы должны создать свое собственное и слушать там. Это позволяет вам не наступать на ноги любому разработчику, который использует ваш пакет.
Пространства имен позволяют нам разделять соединения на разные контексты. Мы можем сравнить это с комнатами, которые позволяют нам группировать соединения. Затем мы можем иметь такое же соединение и для других комнат.
Пространства имен позволяют создавать различные контексты для работы с Socket.IO. Комнаты позволяют группировать клиентские соединения внутри этих контекстов.
Это старый вопрос, но после некоторого исследования по этой теме я обнаружил, что принятый ответ не ясен по важному вопросу. По словам самого Гильермо Рауха ( см. Ссылку ): хотя теоретически возможно динамически создавать пространства имен в работающем приложении, вы используете их главным образом как предопределенные отдельные разделы вашего приложения. Если, с другой стороны, вам нужно на лету создавать специальные отсеки для размещения групп пользователей / соединений, лучше всего использовать комнаты.
источник
Это зависит от того, что ты хочешь сделать.
Основное отличие состоит в том, что комнаты сложнее реализовать. Вы должны создать метод для объединения комнат с каждой перезагрузкой страницы.
С пространствами имен вам просто нужно написать
var example = io.connect('http://localhost/example');
в своем клиенте javascript, и клиент автоматически добавится в пространства имен.Пример использования:
источник
Комнаты и пространства имен сегментируют связь и группируют индивидуальные розетки.
Трансляция в комнату или в пространство имен не сможет охватить всех, кроме участников.
Разница между пространствами имен и комнатами заключается в следующем:
Разница главным образом в том, кто ими управляет
Чтобы решить, что использовать, вы должны решить, следует ли управлять сегментацией во внешнем интерфейсе или во внутреннем интерфейсе.
источник
Пространства имен позволяют вам создавать объекты с одинаковыми именами, но они будут разделены, так как они будут жить в разных пространствах имен, иначе называемых областями.
Это тот же мыслительный процесс, который вы должны использовать с пространствами имен Socket.IO. Если вы создаете модульное веб-приложение Node, вам нужно выделить пространство имен для различных модулей. Если вы посмотрите на наш код пространства имен, то увидите, что мы смогли прослушивать одни и те же точные события в разных пространствах имен. В Socket.IO событие соединения в соединении по умолчанию и событие соединения в пространстве имен / xxx различаются. Например, если у вас есть система чата и комментариев на вашем сайте, и вы хотите, чтобы оба работали в режиме реального времени, вы можете указать пространство имен. Это позволяет создавать целое приложение Socket.IO, которое живет только в своем собственном контексте.
Это также будет верно, если вы собираете что-то для упаковки и установки. Вы не можете знать, использует ли кто-то уже определенные события в пространстве имен по умолчанию, поэтому вы должны создать свое собственное и слушать там. Это позволяет вам не наступать на ноги любому разработчику, который использует ваш пакет.
Пространства имен позволяют нам разделять соединения на разные контексты. Мы можем сравнить это с комнатами, которые позволяют нам группировать соединения. Затем мы можем иметь такое же соединение и для других комнат.
Пространства имен позволяют создавать различные контексты для работы с Socket.IO. Комнаты позволяют группировать клиентские соединения внутри этих контекстов.
источник