Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Счетчик новых сообщений (webSocket java)

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Добрый день. Прошу совета или идею. Сразу скажу что я начинающий java developer, для опыта пишу свой домашний онлайн проект.
Перейду к делу. В проект необходимо добавить, так сказать, чат.
Что имеем. Несколько страниц, с кнопкой чат, а в скобках — кол-во новых сообщений. Перешли, выбрали нужного человека, отписались(оставили закрытым, открытым — не важно). У того человека, которому писали, должно увеличится кол-во новых сообщений вне зависимости от того на какой странице он находится. Всё это планирую делать на websockets.
Реализовать чат, в принципе сложно но можно, инфы в инете хватает.
Реализовать онлайн обновление счетчика сообщений можно через аякс запросы, но хочется сразу делать правильно.

Есть идея сделать так:
1. На каждой страннице джаваскриптом создаётся вебсокет.
Вот тут вопрос, при переходе со станицы на страницу, один закрывается, второй открывается, на сколько это затратно по ресурсам?
2.В идеале есть один серверный вебсокет на все страницы. Тут сразу же вопрос, можно ли? Если нет, то два вебсокета один — для чата, второй — для остальных страниц. Совсем не хочется — на каждую страницу свой вебсокет.
3.Так как при переходе со страницы на страницу, вебсокеты закрываются — открываются, то в вебсокеты из (2) добавить приватное поле — объект(сингельтон), который будет хранить список юзеров онлайн (при закрытии вебсокета, пользователь удаляется, при открытии — добавляется).
4. При отправке сообщения, в этом списке ищется нужный пользователь, в случае, если он найден, то обновляется либо кол-во сообщений, либо добавляется сообщение в чат, в зависимости на какой странице он находится.
Тут тоже вопрос, если он открыл сразу две страницы, можно конечно в сингельтон запихнуть Юзер+лист вебсокетов и дергать необходимые функции вебсокетов, но возможно ли это?

Моя мысль хоть немного идет в правильном направлении или можно как-то всё сделать проще?
Инфы в инете не нашел(

П.с. в проекте пользуюсь java8, maven, tomcat8 и Spring Framework.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Как раз таки правильно — это ajax, но данные положи в LocalStorage. А в куки засунь таймстэмп (дату в милисекундах) когда получено последнее сообщение — это поможет тебе подтягивать данные чата уже на открытии страницы. И прежде чем послать запрос, твой код проверит когда последний раз запрос отсылался. Если недавно (то есть другая вкладка уже отправила) — просто возьмёт данные из LocalStorage.

Не забывай о людях с мобильным трафиком, экономь.

Спасибо. Довольно интересная идея.
А если так: хранить кол-во новых сообщений в куки. Изменять значение куки при отправке сообщения этому человеку. Запускать код на джаваскрипте каждые 30 сек, который будет просто считывать значения из куки.
Сойдет?

П.с. в данном случае меня интересуют все возможные идеи для понимания, что и как можно делать, так как сейчас ещё нет знания нюансов и культуры программирования в вебе.

Запускать код на джаваскрипте каждые 30 сек, который будет просто считывать значения из куки.

Не забывай о людях с мобильным
 — экономь батарею.

Ну тут уж увы:
Либо имеем практически онлайновое оповещение о сообщениях через джаваскрипт+куки(или другой способ, но всё равно с тайм-аутом секунд 30, максимум минута, для актуальных данных);
Либо делать через вебсокеты, тогда ненадо клиента дергать лишний раз;
Либо не заморачиваться и делать при обновлении страницы (но это не интересно).

Ты не понял. В LocalStorage будешь хранить и сами сообщения тоже. Куки нужны для самой страницы, когда плагин чата там ещё не запущен (а может и не должен быть запущен), чтобы количество новых сообщений прилетело вместе со страницей — ты его сам на сервере подсмотришь на этапе генерации сессии.

30 секунд — ни туда ни сюда. В реальных задачах таймаут адаптивен. Хотя ещё более правильно это сделать общение в бесконечном цикле AJAX — ты бросаешь новый запрос сразу как получил ответ, но с длинным таймаутом (например 10 минут). А уже сам сервер отсылает ответ когда будет что ответить. Я не помню как зовётся данная технология, если не лень поищи. Она часто пользуется для общалок, и библиотеки под неё есть. Если проект учебный — не заморачивайся и делай таймаут секунд 5, так красивее демонстрация будет.

Кажется понял, спасибо за наводку ;)

Это long-polling. Устаревший, но ещё достаточно часто используемый метод.

Для веб-чата самое оно, и вряд ли что-то лучшее когда-нибудь появится. Здесь тебе и экономия трафика, и поддержка всеми браузерами, и минимальные требования к производительности. Всё что не-устаревшее так или иначе ждёт коннекта от сервера, то есть само выступает сервером. А это уже упирается в тонкого клиента.

В общем, не стоит искать сложных средств для простых целей. Текстовый чат — это очень простая задача.

На сколько я знаю, то веб сокеты не можно шарить между страницами. Один из возможных воркэраундов этой особенности является применение веб воркера который отвязан от страниц и в нем уже можно будет держать соединение, но тут придется подумать над тем, как закрывать соединения. В теории реюз соединения по веб сокету должен ускорить работу ресурса, если соединение может быть устанавлено на один и тот же сервер с разных страниц, но на практике может оказаться что вместе с тем появится новый гемор. В целом можно попробовать поискать какие-то либы под веб сокеты, которые хотябы дадут браузеро независимую платформу для работы, а то что-то мне подсказывает, что с нативной реализацией могут быть ньюансы с выполнением на разных браузерах.

Вот тут вопрос, при переходе со станицы на страницу, один закрывается, второй открывается, на сколько это затратно по ресурсам?
Всё зависит от реализации.
В идеале есть один серверный вебсокет на все страницы. Тут сразу же вопрос, можно ли?
Да, можно. Надо проверять наличие уже существующего соединения и решать, открывать новый или нет. С другой стороны — если на разных страницах не будет чата, то какой смысл вообще инициализировать там соединение и проводить серверную проверку?
3.Так как при переходе со страницы на страницу, вебсокеты закрываются — открываются, то в вебсокеты из (2) добавить приватное поле — объект(сингельтон), который будет хранить список юзеров онлайн (при закрытии вебсокета, пользователь удаляется, при открытии — добавляется).
Если будете использовать библиотеку типа socket.io — там уже за Вас всё реализовали (и хранение данных и удаление уже неиспользуемых инстансов соответственно), достаточно лишь воспользоваться функционалом.
Тут тоже вопрос, если он открыл сразу две страницы, можно конечно в сингельтон запихнуть Юзер+лист вебсокетов и дергать необходимые функции вебсокетов, но возможно ли это?
Очень просто реализуется с помощью событий между сервером и клиентом.
Моя мысль хоть немного идет в правильном направлении или можно как-то всё сделать проще?
Не делайте себе нервы, это не сложно.
Инфы в инете не нашел(
Плохо искали, или не так.
С другой стороны — если на разных страницах не будет чата, то какой смысл вообще инициализировать там соединение и проводить серверную проверку?
Что бы при приходе нового сообщения обновлялся счетчик новых(не прочитанных) сообщений.

Спасибо за ссылку, ознакомлюсь)

Не делайте себе нервы, это не сложно.
Нервы я себе не делаю, просто интересуюсь на сколько верна моя мысль, так как я — новичёк)
Плохо искали, или не так.
Всё может быть.

Підписатись на коментарі