Что такое 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");
[Доступные функции]
- Присоединение к комнате:
socket.join("roomName"); / socket.join(["roomName1", "roomName2"]); для многократного участия. - Выход из комнаты:
socket.leave("roomName"); / socket.leave(["roomName1", "roomName2"]); - -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 :"данные"}); - Событие, выполняемое, когда пользовательский сокет отключен (но все еще находится в комнате):
«disconnecting» - Сделать так, чтобы все/конкретные сокеты в определенной комнате принудительно присоединялись к другой комнате (server.js):
io.in("room1").socketJoin(["room2", "room3"]);
io .in(theSocketId).socketJoin("room1"); - '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