1

прошу помочь мне в понятии, как устроены чаты в messengerах на Websocket.

Я встречал многие статьи по написаю backend для чата. Но все они описывают какой-то общий чат.

Т.е между клиентом и сервером устанавливается websocket соединение, когда пользователь отправляет сообщение, сервер его принимает и рассылает его всем другим пользователем.

Т.е все пишут в общий чат, и все читают в этом чате.

Но как устроены именно чаты, например из 3 человек, или личные сообщения (это же тоже чат, просто из 2 человек).

Рассмотрим, например чат из 3 человек: 1. Человек A, отправил сообщение в наш чат (например в /messages), сервер принял, и ему нужно отправить это 2 другим.

Куда он отправит, в такое же соединение каждого из пользователей с сервером, которые слушают /messages? но ведь /messages слушают все пользователи (не только этого чата). Как это устроено?

Или это будет не /messages, а chat, и все 3 человека слушают именно /chat?id=1002. Но тогда я не понимаю, как это устроено. Например, пользователь создал чат с этими 2 людьми, но как они узнают об этом, они же не подписаны еще на /chat?id=1002.

Заранее спасибо

danilshik
  • 3,077
  • Так в сообщении написанно кому оно отправленно – eri Mar 28 '20 at 22:00
  • Websocket - это лишь способ обмена данными и не более. Разница между Ajax и WS-чатами лишь в том, что вместо лонгполлинга используются хендшейки. – Beast Winterwolf Mar 28 '20 at 22:02
  • Всё очень просто. На сервер отсылается специальное сообщение, что пользователь вошёл в чат с id таким-то. При написании обычных сообщений рассылка будет идти только по пользователям из этого же чата. Короче, вместо простого текста вы можете отправить служебную команду. – ArchDemon Mar 28 '20 at 22:59
  • @BeastWinterwolf( ну вот если у меня был rest api, то пользователь бы отправлял на сервер json с параметрами, от кого, кому, сообщение, chat_id. Другие пользователи с определенным интервалами, просто запрашивали обновления message в chat_id и все. С websocket, пользователи должны подписываться на chat с определенным id? верно? и все сообщения транслируются всем другим?.

    Т.е при авторизации пользователь сначала должен подписаться на главный / (канал), сервер понял, что пользователь в сети. Теперь пользователь еще подписывается на все чаты? например на /chat?id=1, chat?id=2, и т.д?

    – danilshik Mar 28 '20 at 23:36
  • @ArchDemon я правильно понял? – danilshik Mar 28 '20 at 23:40
  • @ArchDemon, например я сижу, и мне прилетает приглашение присоединиться к чату. Но ведь я на чат еще не подписан, следовательно, это должно прилетать в главном (например, мы будет называть его системным, на который мы подписались, когда авторизовывались)? И после присоединения, я должен теперь еще подписаться на чат, к которому присоединился, верно?

    Просто я хочу с websocket до этого не работал, захотел понять, написав небольшой messenger, но не знаю как устроен backend под websocket, чтобы его написать.

    Как я понял, теперь мне нужно держать на сервере список авторизованных клиентов

    – danilshik Mar 28 '20 at 23:43
  • И список чатов , которые создаются и заносятся в список, когда пользователь по системному каналу (который при авторизации), сообщил серверу, что захотел создать чат с тем то человеком. Сервер получил, создал чат с человеком, положил в список, и по системному каналу с другим человеком B оповестил его, что он присоединился к созданному чату пользователем A. Верно? – danilshik Mar 28 '20 at 23:46
  • Если верно, то согласно этому сайт https://www.pvsm.ru/programmirovanie/200480 whatsapp сохраняет сообщения в чате, пока пользователь не прочитает, и кода он прочитает, то сообщение удаляется с сервера. Так как пользователей в чате больше 2, то придется под каждого пользователя дублировать сообщения, и после прочтения пользователем A удалять его копию сообщений с сервера, верно? – danilshik Mar 28 '20 at 23:56
  • Вы лучше начните писать. Если что-то всплывёт, спросите тут, но уже конкретный вопрос. Потому что вы с websocket чата переключились на whatsapp, а это уже две большие разницы. – ArchDemon Mar 29 '20 at 08:05
  • Архитектура может варьироваться. Я не знаю всех тонкостей, как вы пытаетесь это реализовать, но мне кажется, что вы запутались именно из за этого термина "подписки", который вы ввели. Если раньше никаких подписок не было, то наверно они вам и не нужны. Делайте всё также, как и раньше, просто вместо периодического опроса сервера теперь сокет-соединение. Рассматривайте активное соединение как пользователя в сети, а не как канал чата. – Beast Winterwolf Mar 29 '20 at 18:40

0 Answers0