Как обрабатывать одно соединение через веб-сокет для всех чатов в каналах Django - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу создать приложение для чата, такое как WhatsApp, и хочу сделать внутренний сервер, использующий каналы Django, для обработки всех обновлений в реальном времени.

Я изучал различные источники, но не мог понятьОдно из того, как мне управлять одним соединением веб-сокета (одной конечной точкой) для каждого пользователя и при этом получать сообщения от всех чатов, частью которых он является, в режиме реального времени.Согласно моему нынешнему пониманию, я могу добавить канал (подключение к веб-сокету, соответствующее пользователю) к различным группам каналов, но что, если пользователь является частью большого количества групп (в основном, имеет право получать обновления из различных чатов)?Если я добавлю этот канал ко всем группам, он может стать его частью, как только соединение будет установлено, или есть какой-нибудь обходной путь, подобный одному:

  1. Сохраните список каналов, соответствующих каждомупользователь в базе данных.
  2. Выполнить цикл for, чтобы при получении сервером сообщения отправляло сообщения на соединения веб-сокетов, соответствующие каждому участвующему пользователю для получения этого сообщения?

Любая помощь приветствуется.Заранее спасибо.

1 Ответ

0 голосов
/ 03 февраля 2019

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

Однако вам определенно потребуется смоделировать систему чата в базе данных для более сложной работы.система.Допустим, у вас есть модель Chat, ChatMember и Message.Когда пользователь подключается к веб-сокету, ему не нужно указывать какой-либо чат, потому что это обычное соединение.Любое сообщение, отправленное клиентом, должно указывать в чате, чтобы вы могли просмотреть участников чата и переслать сообщение всем, кто в данный момент подключен.

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

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

Это всего лишь пример способа его реализации, но вы также можете придумать собственную архитектуру или улучшить ее..

...