1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/cookeem-CookIM

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Конф/application.conf, пожалуйста, убедитесь, что ваша конфигурация URI MongoDB верна.

mongodb {
  dbname = "cookim"
  uri = "mongodb://mongo:27017/local"
}

Соберите проект CookIM в fatjar, целевой jar находится по адресу target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar

sbt clean assembly

Category

Запустите сервер CookIM

CookIM использует MongoDB для хранения сообщений чата и данных пользователей. Перед запуском CookIM необходимо запустить MongoDB.

Есть два способа запустить сервер CookIM: sbt и java. a. Отладка с помощью sbt:

$ cd #каталог CookIM#

$ sbt "run-main com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551"

b. Соберите и скомпилируйте fat jar:

$ sbt assembly

c. Производственный способ Java:

$ java -classpath "target/scala-2.11/CookIM-assembly-0.2.4-SNAPSHOT.jar" com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551

Приведённая выше команда запускает веб-сервер, который прослушивает порт 8080, и систему akka, которая прослушивает порт 2551.

Параметры: -a — порт узла кластера akka -h [-m ] [-n] -s -w -a, --akka-port – порт узла кластера akka -h, --host-name – текущее внешнее имя хоста веб-службы -m, --mongo-uri – URI подключения mongodb, пример: mongodb://localhost:27017/local -n, --nat – сеть nat или в докере -s, --seed-nodes – начальные узлы кластера akka, разделяются запятой, пример: localhost:2551,localhost:2552 -w, --web-port – порт веб-службы

Category

Откройте браузер и получите доступ к порту 8080

http://localhost:8080


Category

Запуск другого сервера CookIM

Откройте другой терминал и запустите другой сервер CookIM для проверки обмена сообщениями между серверами: a. отладка с помощью sbt:

$ sbt "run-main com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551"

b. производственный способ java:

$ java -classpath "target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar" com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551

Приведенная выше команда запускает веб-сервер, прослушивающий порт 8081, и систему akka, прослушивающую порт 2552.

Category

Откройте браузер и получите доступ к порту 8081

http://localhost:8081


Category

Архитектура

Изображение архитектуры

Изображение архитектуры Сервер CookIM состоит из 3 частей:

  1. akka http: предоставляет веб-службу, браузер подключается к распределённым серверам чата через websocket
  2. akka stream: akka http получает сообщения websocket (сообщения websocket включают TextMessage и BinaryMessage), затем отправляет сообщение в chatService способом akka stream, сообщение websocket включает JWT(Javascript web token), если проверка JWT не удалась, поток chatService вернёт отклоняющее сообщение; если проверка JWT прошла успешно, поток chatService отправит сообщение в ChatSessionActor
  3. akka cluster: поток akka stream отправляет сообщения websocket в akka cluster ChatSessionActor, ChatSessionActor использует DistributedPubSub для подписки и публикации сообщений в akka кластере. Когда пользователь онлайн, он будет подписываться на сеанс; когда пользователь отправляет сообщение в сеансе, он опубликует сообщение в akka кластере, актёры, которые подписались на сеанс, получат опубликованное сообщение

Category

Граф потока akka websocket

Поток CookIM

  • Когда akka http принимает сообщение от websocket, оно отправляет сообщение в поток chatService, здесь мы используем граф потока akka:
  1. Тело сообщения websocket содержит JWT, flowFromWS используется для получения сообщения websocket и декодирования JWT;
  2. Если проверка JWT не пройдена, она будет транслироваться в filterFailure для фильтрации неудачных сообщений; если проверка JWT успешна, она будет транслироваться в filterSuccess для фильтрации успешных сообщений;
  3. При создании akka потока builder.materializedValue отправит сообщение connectedWs, connectedWs преобразует полученное сообщение в сообщение UserOnline, а затем отправит его в chatSinkActor, наконец, отправит в... Чат-актёр;
  1. Чат-актёр отправляет сообщение чат-сессии, когда поток акка закрыт, он отправит сообщение «UserOffline» вниз по потоку;
  1. Источник чата получает ответное сообщение от чат-сессии и отправляет его обратно в flowAcceptBack;
  1. flowAcceptBack позволяет поддерживать соединение через веб-сокет;
  1. Сообщения flowReject и flowAcceptBack в конечном итоге отправляются в flowBackWs, flowBackWs преобразует сообщения в формат веб-сокетов и отправляет их обратно пользователям;

Category

Спецификация таблиц MongoDB

  • users: таблица пользователей
*login (логин email)
nickname (никнейм)
password (пароль SHA1)
gender (пол: неизвестно:0, мальчик:1, девочка:2)
avatar (абсолютный путь аватара, пример: /upload/avatar/201610/26/xxxx.JPG)
lastLogin (последняя отметка времени входа)
loginCount (количество входов)
sessionsStatus (статус пользователя в сессиях)
    [{sessionid: идентификатор сессии, newCount: количество непрочитанных сообщений в этой сессии}]
friends (список друзей пользователя: [идентификаторы друзей])
dateline (отметка времени регистрации)
  • sessions: таблица сессий
*createuid (идентификатор создателя)
*ouid (идентификатор получателя, доступен, если тип сессии — приватная)
sessionIcon (значок сессии, доступен, если тип сессии — группа)
sessionType (тип сессии: 0: приватная, 1: группа)
publicType (публичный тип: 0: не публичная, 1: публичная)
sessionName (название сессии)
dateline (созданная отметка времени)
usersStatus (пользователи, которые присоединились к этой сессии)
    [{uid: uid, online: (true, false)}]
lastMsgid (последний идентификатор сообщения)
lastUpdate (последняя отметка обновления)
  • messages: таблицы сообщений
*uid (идентификатор отправителя)
*sessionid (относительный идентификатор сессии)
msgType (тип сообщения)
content (содержание сообщения)
fileInfo (информация о файле)
    {
        filePath
        fileName
        fileType
        fileSize
        fileThumb
    }
*dateline (созданная отметка времени)
  • onlines: таблица онлайн-пользователей
*uid (идентификатор онлайн-пользователя)
dateline (последняя отметка обновления)
  • notifications: таблица уведомлений
noticeType (тип уведомления: «joinFriend», «removeFriend», «inviteSession»)
senduid (идентификатор отправляющего пользователя)
*recvuid (идентификатор получающего пользователя)
sessionid (относительный идентификатор сессии)
isRead (уведомление прочитано: 0: непрочитано, 1: уже прочитано)
dateline (созданная отметка времени)

Category

Тип сообщений веб-сокетов

Существует два канала веб-сокетов: ws-push и ws-chat

Канал ws-push отправляет новые сообщения сессий пользователям, даже если пользователь не в сети, они всё равно могут получать сообщения о новых сообщениях в сессиях

Канал /ws-push

up message, используется для подписки на push-сообщения:
{ userToken: "xxx" }

down message:
acceptMsg:     { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "accept", content: "xxx", dateline: "xxx" }
rejectMsg:     { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "reject", content: "xxx", dateline: "xxx" }
keepAlive:     { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "keepalive", content: "", dateline: "xxx" }
textMsg:       { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "text", content: "xxx", dateline: "xxx" }
fileMsg:       { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "file", fileName: "xxx", fileType: "xxx", fileid: "xxx", thumbid: "xxx", dateline: "xxx" }
onlineMsg:     { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "online", content: "xxx", dateline: "xxx" }
offlineMsg:    { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "offline", content: "xxx", dateline: "xxx" }
joinSessionMsg: { uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "join", content: "xxx", dateline: "xxx" }
leaveSessionMsg:{ uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "leave", content: "xxx", dateline: "xxx" }
noticeMsg:     {

*Примечание: В тексте запроса присутствуют таблицы, описывающие структуру данных в базе данных MongoDB. Эти таблицы содержат информацию о полях и типах данных для различных сущностей, таких как пользователи, сессии и сообщения. Перевод этих таблиц не входит в задачу переводчика, так как это требует понимания структуры данных и контекста использования. Однако, если требуется перевод названий полей или типов данных, то это можно сделать.*

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Распределённая программа для чата на основе WebSocket и технологии Akka. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/cookeem-CookIM.git
git@api.gitlife.ru:oschina-mirror/cookeem-CookIM.git
oschina-mirror
cookeem-CookIM
cookeem-CookIM
master