Что такое Websocket и как мы можем их использовать?

👉примеры кодов

[[ HTTP против веб-сокета ]]

Общность: оба являются протоколами

  • HTTP:
    состоит из запроса ‹-› ответа. Без сохранения состояния (не в режиме реального времени).
    Не удалось вспомнить пользователя после ответа.
  • WebSocket:
    Если поддерживается, можно использовать 'wss' вместо 'http'.
    Браузер ‹-соединение-› Сервер (двунаправленный), Или сервер ‹-› сервер также возможно!
    Возможна связь в режиме реального времени после установления соединения.
    Запоминает пользователя.
    Может отправлять информацию с сервера, не дожидаясь запроса.
    Встроенный API WebSocket можно использовать в браузере.

[[ws: библиотека WebSocket для nodeJS]]

  • Его можно использовать аналогично addEventListener в HTML.
  • Инициируются события, и указывается функция для их обработки. socket.addEventListener («открыть», обратный вызов);
  • Помните о порядке выполнения:
    Когда WebSocket подключается › wss.on(“connection”, (socket)=›{}); выполняется,
    socket.addEventListener("open", callback); выполняется
    server.js › socket.send("привет!"); отправляется.
    app.js › socket.addEventListener («сообщение», обратный вызов); выполняется.
    При отключении › socket.addEventListener(“message”, callback); выполняется.

** При подключении к http://localhost:3000 из разных браузеров:
браузеры подключены к одному серверу, но не связаны друг с другом,
поэтому они не могут обмениваться отправленными сообщениями друг другом.

** В app.js и handleSubmit(), и handleNickSubmit() используют socket.send().
Один из них отправляет сообщение, а другой отправляет псевдоним, но поскольку сервер получает оба из них как «on(« message»,
невозможно различить, что к чему.
Поэтому при отправке аргумент должен быть строковым JSON-объектом со значениями 'type:payload'.

[[SocketIO: WebSocket Framework]]

  • SocketIO:
    Обеспечивает связь в реальном времени на основе событий с использованием WebSocket.
    Он нормально работает, даже если WebSocket браузера недоступен (высокая надежность).
    Многие функции необходимы для связи в реальном времени. уже встроены, что делает его удобным.
    При подключении к серверу SocketIO
    http://localhost:3000/socket.io/socket.io.js
    можно получить доступ к верхней ссылке.
    Поскольку функция SocketIO более обширна, чем WebSocket браузера, SocketIO также должен быть установлен в браузере (спереди).
    Поэтому добавьте скрипт в файл представления после указанного выше URL-порта. путь
    (скрипт(src="/socket.io/socket.io.js"))
  • Особенности/Преимущества:
    1. В отличие от ‘ws’, вы можете указать имя события напрямую, и можно передавать объекты.
    +) функция emit() -> Можно также передавать несколько объектов. Неограниченно.
    2. В начале (app.js) последний аргумент функции socket.emit() может связывать функцию обратного вызова. (Необязательно, но должно быть размещено в самом конце.) Если вы вызываете эту функцию обратного вызова в методе server.js on() (done();), она будет работать на передней панели (app.js), а не на задней. .
    3. При отключении сервера-браузера он моментально ищет другой активный io сервер, а при неудаче выдает ошибку в браузере. Он будет повторять попытку каждые несколько секунд, поэтому, если вы «запустите» сервер, ошибка прекратится.
    4. Предоставляет свой собственный идентификатор (socket.id) и свою комнату. -> socket.rooms / socket.join("room_name");

[Доступные функции]

  1. Присоединение к комнате:
    socket.join("roomName"); / socket.join(["roomName1", "roomName2"]); для многократного участия.
  2. Выход из комнаты:
    socket.leave("roomName"); / socket.leave(["roomName1", "roomName2"]);
  3. -1) Отправить сообщение/сообщение+событие «всем остальным» в комнате, отправить приватно «другим пользователям».
    socket.to("roomName"); / socket.to(["roomName1", "roomName2"]);
    socket.to("roomName").emit("eventName", {some:"data" });
    socket. to( /*specificUserSocketID*/ ).emit(“hey”);
    -2) Отправить событие на все подключенные сокеты на сервере.
    io.sockets.emit(“event”, {some :"данные"});
  4. Событие, выполняемое, когда пользовательский сокет отключен (но все еще находится в комнате):
    «disconnecting»
  5. Сделать так, чтобы все/конкретные сокеты в определенной комнате принудительно присоединялись к другой комнате (server.js):
    io.in("room1").socketJoin(["room2", "room3"]);
    io .in(theSocketId).socketJoin("room1");
  6. 'socket.rooms' и 'io.sockets.adapter.rooms' различаются.
    socket.rooms: возвращает объект Set комнат, к которым принадлежит подключенный пользователь (браузер).
    io.sockets. adapter.rooms: возвращает все комнаты (ключ) и их идентификаторы сокетов в объекте Set (значение), подключенном к socketIO (объект карты).
    io.sockets.adapter.sids: возвращает все идентификаторы сокетов (ключ) и ( ID, имя комнаты Set) (значение), связанное с socketIO (объект карты).
    *** Обратите внимание, что в JavaScript, когда forEach в объекте 'map', порядок аргументов следующий (val, key).

[[Адаптер]]

Схема подключения:
client1 — serverA (сокет) — адаптер Mongo — MongoDB
client2 — serverB (сокет) — адаптер Mongo — MongoDB

Адаптер = позволяет client1 и client2, подключенным к разным серверам, взаимодействовать, подключаясь к базе данных.

Необходим для крупномасштабных приложений.

Если адаптер и база данных не подключены для использования, система работает с использованием информации о памяти, поэтому клиент1 и клиент2 не могут обмениваться данными.

[[ Пользовательский интерфейс администратора для SocketIO ]]

Ссылка на ссылку: https://socket.io/docs/v4/admin-ui/

=› Панель пользовательского интерфейса администратора для бэкэнда SocketIO. Позволяет просматривать все розетки, комнаты и пользователей.

Позволяет отдельным или глобальным сокетам присоединяться/выходить из комнат.

Требуется установка › npm i @socket.io/admin-ui