socket.io номерів або простору імен?


163

Я досліджую nodejs / socket.io для спілкування в режимі реального часу, і мені потрібні поради щодо впровадження кімнат.

Що краще, використовуючи простір імен або використовуючи функцію кімнати, щоб повністю ізолювати груди балачок один від одного?

яка реальна технічна різниця між приміщеннями та простором імен?

Чи є різниця у використанні ресурсів?

Відповіді:


216

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

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

Ці відмінності :

  • простори імен підключаються клієнтом за допомогою 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
Люблю це! Простори імен - заздалегідь визначені з'єднання. Номери - Динамічні сполучення
Нандакумар

16

Це залежить від того, що ти хочеш робити.

Основна відмінність полягає в тому, що приміщення складніше здійснити. Ви повинні створити метод для приєднання кімнат із кожним перезавантаженням сторінки.

З просторами імен вам просто потрібно записати var example = io.connect('http://localhost/example');у свій клієнт JavaScript, а клієнт автоматично додається в простори імен.

Приклад використання:

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

2

Сегменти зв'язку та простори імен та групові індивідуальні розетки.

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

Різниця між просторами імен та номерів полягає в наступному:

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

Різниця полягає головним чином у тому, хто ними керує

Щоб вирішити, що використовувати, ви повинні вирішити, чи слід керувати сегментацією у прямому віці або у вихідному


0

Простори імен дозволяють створювати об’єкти з однаковою назвою, але вони будуть окремими, оскільки вони будуть жити в різних просторах імен, інакше відомих як область застосування.

Це той самий процес мислення, який ви повинні мати з просторами імен Socket.IO. Якщо ви будуєте модульний веб-додаток Node, вам потрібно буде виділити простір імен з різних модулів. Якщо ви переглянете наш код простору імен, то побачите, що ми змогли прослухати однакові події в різних просторах імен. У Socket.IO подія підключення на типовому з’єднанні та події підключення у просторі імен / xxx відрізняються. Наприклад, якщо на вашому сайті була система чату та коментарів і хотіли, щоб вони були в режимі реального часу, ви можете простору імен. Це дозволяє створити цілу програму Socket.IO, яка живе лише у власному контексті.

Це також було б правдою, якби ви будували щось для упаковки та встановлення. Ви не можете знати, чи хтось уже використовує певні події у просторі імен за замовчуванням, тому вам слід створити власну та прослухати там. Це дозволяє не наступати на ноги будь-якого розробника, який використовує ваш пакет.

Простори імен дозволяють нам налагоджувати зв’язки в різних контекстах. Ми можемо порівняти це з кімнатами, які дозволяють нам групувати зв’язки разом. Потім ми можемо мати те ж саме з'єднання, що і в інших кімнатах.

Простори імен дозволяють створювати різні контексти для роботи Socket.IO. Номери дозволяють групувати клієнтські зв’язки всередині цих контекстів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.