Веб-сокеты - это протокол для двунаправленной связи между клиентом и сервером через интернет. Они позволяют установить постоянное соединение между браузером и сервером, который может использоваться для передачи данных в режиме реального времени.
Основные методы, используемые в веб-сокетах, включают:
WebSocket(): конструктор объекта WebSocket, который создает новый экземпляр веб-сокета.
send(): метод, который отправляет данные на сервер через веб-сокет.
close(): метод, который закрывает веб-сокет.
onopen(): событие, которое происходит при открытии соединения с сервером.
onmessage(): событие, которое происходит при получении сообщения от сервера.
onerror(): событие, которое происходит при возникновении ошибки во время работы с веб-сокетами.
При использовании веб-сокетов, клиент и сервер устанавливают постоянное соединение. Как только соединение установлено, данные можно передавать в обоих направлениях без необходимости повторного подключения или перезагрузки страницы.
При передаче данных через веб-сокеты, данные могут быть закодированы в различных форматах, таких как JSON, XML или бинарный формат. Веб-сокеты также позволяют отправлять и получать файлы, аудио и видео потоки и другие типы данных в режиме реального времени.
Реализация
На стороне сервера создается объект rooms, который содержит список всех комнат и пользователей в каждой комнате. При создании новой комнаты сервер проверяет, существует ли уже комната с таким же именем, и отправляет сообщение об ошибке, если комната уже существует. Если комната не существует, сервер создает новую комнату и добавляет создателя комнаты в список ее участников.
В обработчике для присоединения к комнате сервер проверяет, существует ли комната с указанным именем, и отправляет сообщение об ошибке, если комната не существует. Если комната существует, сервер добавляет пользователя в список ее участников и отправляет всем участникам комнаты сообщение о том, что новый пользователь присоединился к комнате.
Обработчик для отправки сообщения в комнату просто передает полученные данные всем участникам комнаты, используя метод io.to(roomName).emit().
Обработчик для отключения пользователя от чата удаляет пользователя из всех комнат и отправляет сообщение об уходе всем участникам соответствующих комнат.
server.js
Клиентский код использует две основные функции - joinRoom() для присоединения к комнате и switchRoom() для переключения на новую комнату. Когда пользователь присоединяется к комнате, он отправляет на сервер сообщение join_room с именем комнаты и своим именем пользователя. Сервер добавляет пользователя в список участников комнаты и отправляет всем участникам комнаты сообщение joined_room с списком всех участников. Каждый раз, когда пользователь отправляет сообщение в комнату, клиентский код отправляет на сервер сообщение send_message, которое содержит текст сообщения и имя текущей комнаты. Сервер затем отправляет всем участникам комнаты сообщение new_message, которое содержит текст сообщения, имя отправителя и имя текущей комнаты.
Когда пользователь покидает комнату или отключается от чата, клиент отправляет на сервер сообщение disconnect, который удаляет пользователя из всех комнат и отправляет соответствующие сообщения об уходе. Каждый пользователь также может задать свое имя при входе в чат, используя сообщение set_username.