Поясните как реализовать личные сообщения по вебсокету?

В основе использую yii2 и morozovsk/websocket.
Начал разбираться с вебсокетами. Понял принцип работы.

Так вот, сейчас мне нужен вебсокет для организации личных сообщений и я столкнулся с следующими вопросами:
1) делать вебсокет под каждый чат? Или 1 для всех?
2) Как хранить идентификатор определенного чата? например чат между Пользователь1 и П2, П1 и П3, П2 и П3 и тд...
3) Как авторизировать пользователя в вебсокете? использовать токен и посылать его в первый раз?


Тыкните меня в концепсию всего этого, пожалуйста.
  • Вопрос задан
  • 948 просмотров
Решения вопроса 4
@Levhav
Возьмусь за разработку проектов любой сложности.
Если использовать CppComet комет сервер https://github.com/CppComet/comet-server то в нём уже решены вопросы авторизации и управления вебсокт соединением.
Вот есть пример чата с авторизацией https://comet-server.com/wiki/doku.php/comet:chat-... и вот ещё про авторизацию https://comet-server.com/wiki/doku.php/comet:authe...
Ответ написан
Комментировать
Slavenin999
@Slavenin999
программист php/erlang/elixir/js
я просто оставлю это здесь
https://github.com/postHawk
тут про symfony https://habrahabr.ru/company/posthawk/blog/303098/ для yii можно использовать напрямую https://github.com/postHawk/hawk_api
Ответ написан
Комментировать
qonand
@qonand
Software Engineer
1) делать вебсокет под каждый чат? Или 1 для всех?

Если нужна асинхронность обновления чатов - тогда нужно на каждый чат веб-сокет, если нет - тогда один на все чаты.
2) Как хранить идентификатор определенного чата? например чат между Пользователь1 и П2, П1 и П3, П2 и П3 и тд...

Генерировать на сервере соответствующий идентификатор, отдавать его клиенту и где-то там сохранять, например в LocalStorage
3) Как авторизировать пользователя в вебсокете? использовать токен и посылать его в первый раз?

Да авторизовываться через токен
Ответ написан
Комментировать
@xfg
1. Пользователь устанавливает вебсокет соединение с сервером.
2. Пользователь пробует добавить сообщение в чат. Отправляет запрос:
{id: 1, action: 'chat:add', params: {chat_id: 1}}
3. Сервер присылает ответ
{id: 1, error: 'Not authenticated'}
4. Пользователь отправляет
{id: 2, action: 'user:login', params: {email: 'test@me', password: 'qwerty'}}

5. Сервер отвечает
{id: 2, data: {token: '123456'}}
6. Пользователь повторяет пункт 2. Сервер отправляет пользователю успешный ответ, а его собеседника уведомляет новым личным сообщением.

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

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

Войдите, чтобы написать ответ

Похожие вопросы