20 November 2014

Как работают rooms в Socket.io

Node.JS
В качестве предисловия

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

Тем не менее, один проект я делал и связан он был — да, да с socket.io. Вот и в этот раз я подумал, что он идеально подойдет. Более того, на сайте даже есть демо и пример чата. Но, как всегда в жизни, все оказывается сложнее, чем в примерах.

Чат из примера отсылал сообщения абсолютно всем. Было понятно что как-то надо добавить пользователей в комнату. И если мы взглянем в документацию socket.io rooms and namespaces — здесь описано как работать с комнатами, но непонятно как они работают. Вот с этимм я предлагаю разобраться.

А чтобы понять как работают комнаты. Давайте начнем с самого начала — взглянем что же представляет из себя объект io.

var io = require('socket.io')(http);


image

Как видно IO хранит все идентификаторы подключенных сокетов. А это значит, зная иденификатор сокета мы можем найти его.

var socket = io.sockets.connected[socketId];


Т.е. каждый сокет при создании получает уникальный идентификатор, по которому его можно найти. А теперь давайте взглянем на сокет подключенный к определенной комнате.

var room = uuid.v4();
socket.join(room);


image

Как видно дефолтный ID сокета автоматически добавляется в rooms. Там же мы можем найти и ID нашей комнаты. Таким образом когда мы отсылаем сообщение в комнату

io.sockets.to(room).emit('message', {message: "details"});


Я могу предположить, что IO проходит по rooms приконекченных сокетов и рассылает сообщение им.

Все достаточно просто, верно? Но должен признаться в начале я никак не мог совладать с пониманием как работают комнаты. Так что надеюсь это статья кому-то будет полезна.
Tags:nodejssocket.io
Hubs: Node.JS
+2
28.2k 38
Comments 3
Top of the last 24 hours