javascript AJAX-Чат как создать -- основные идеи
Primary tabs
Наиболее простой чат можно сделать следующим образом:
- На стороне сервера только три обработчика:
- Отправка сообщения
- Удаление конкретного сообщения
- Отдача новых сообщений
- На странице (HTML) есть два принципиальные блока:
- Форма отправки у тех кто может писать (или у всех)
- Блок ленты сообщений -- сюда попадают сообщения по мере их создания
- Функция отправки сообщения не работает с лентой -- то есть не добавляет новый блок, возлагая эти обязанности на функцию получения новых сообщений, которая запускается каждый сколько-то секунд.
- Идея синхронизации проста -- все сообщения имеют timestamp (временную метку), первый после загрузки страницы лента загружается ajax-ом и не отправляет никакой временной метки -- а значит получает все сообщения, в ответ сервер указывает самую последнюю временную метку из тех сообщений. что он отдал.
- Скрипт фронта сравнивает временную метку пришедшую от сервера с той, что ему уже (если) известна, если пришедшая метка новее -- то сообщений из данного ответа сервера загружаются в ленту, а сама она становится текущей (последней самой новой известной ленте). Но на самом деле
- Таким образом, если на бэк передана при запросе новых сообщений метка, от он отдаёт только те сообщение, которые имеют метку не старше, чем переданная с фронта.
- Когда сервер определяет новые сообщения возможна ситуация, что по одной временной метке у него будут несколько сообщений - и не известно есть ли они в ленте (какие есть, а какие нет). На этот случай помимо временной метки используем ещё и список id сообщений, соответствующих последней временной метке -- этот параметр возвращется сервером, потом сохраняется на фронте, и передаётся с очередным запросом новых сообщений.
А потому на стороне фронта надо сравнивать временные метки нестрого (>=) + проверять изменился или нет список пришедших от сервера last_id
Синхронизация сообщений
Что ещё может пригодиться
- Log in to post comments
- 1784 reads