Это способ, при котором мы с клиента отправляем запрос на сервер, который висит ровно до тех пор, пока сервер не ответит на него. Если время ожидания закончилось, то мы с клиента отправляем запрос заново.
Если сервер нам что-нибудь вернёт, то мы опять отправляем запрос на получение данных с сервера.
Этот способ самый простой и требует от нас просто постоянно запрашивать данные с клиента на сервер
Тут пользователь отправляет get-запрос, но мы не возвращаем ему ответ (ответ мы забиндили в событие). Взамен мы ждём, когда другой участник чата отправит сообщение и уже только после этого событие в get-запросе вызываем, после чего всем участникам чата возвращается ответ
На сервере мы имеем:
пост-запрос, который вызывает функцию внутри гет-запроса
гет-запрос, который хранит в себе ивент, срабатываемый, когда на сервер отправляют запрос с данными
На клиенте нам нужно написать функцию, которая будет отправлять постоянно запрос на получение данных subscribe() и функцию, которая будет отправлять эти данные sendMessage(). Уже только тогда после отправки сообщения триггернётся гет на сервере и отдаст сообщения
И теперь в двух разных браузерах мы реализовали чат в реальном времени
event soursing (server sent events)
Второй варинат взаимодействия - это event soursing, который подразумевает под собой, чтобы было установлено постоянно одностороннее соединение с сервера к клиенту.
Клиент только получает ответы от сервера на изменённые данные и больше ничего не происходит.
Строится данный подход на базе обычного https
На сервере мы создаём специальный заголовок, который определит, что наши запросы имеют постоянный характер и создаём многоповторный ивент, который будет записывать ответ специальным образом
На клиенте нужно поменять функцию subscribe(), которая будет работать с классом EventSource, который, в свою очередь, уже будет отслеживать получение сообщений
И наш чат всё так же продолжает работать, но теперь посредством передачи сырых данных
WebSockets
Вебсокеты - это технология, которая позволяет устанавливать между клиентом и сервером постоянную (дуплексную) связь для обмена данными
Вебсокеты используются, например, в чатах для того, чтобы сообщение приходило сразу без потребности в перезагрузке страницы. Или в новостях, чтобы их быстро обновлять.
Это самый мощный способ организовать взаимодействие между клиентом и сервером и требует поднятия отдельного вебсокет-сервера
Изначально нам нужно поднять отдельный сервер вебсокетов
Далее мы описываем события, при которых будут срабатывать сокеты.
Изначально WebSocket создаётся для одного человека на одно подключение и сообщение по-умолчанию будет передаваться только самому пользователю. Чтобы оно отправлялось сразу обоим людям в чате, нужно создать широковещатель broadcastMessage().
На клиенте нужно уже будет описать подключение к сокетам и описать реакции сокета на его разные состояния (ошибка, подключение и так далее)