Конф/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
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.
Откройте другой терминал и запустите другой сервер 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
Сервер CookIM состоит из 3 частей:
- akka http: предоставляет веб-службу, браузер подключается к распределённым серверам чата через websocket
- akka stream: akka http получает сообщения websocket (сообщения websocket включают TextMessage и BinaryMessage), затем отправляет сообщение в chatService способом akka stream, сообщение websocket включает JWT(Javascript web token), если проверка JWT не удалась, поток chatService вернёт отклоняющее сообщение; если проверка JWT прошла успешно, поток chatService отправит сообщение в ChatSessionActor
- akka cluster: поток akka stream отправляет сообщения websocket в akka cluster ChatSessionActor, ChatSessionActor использует DistributedPubSub для подписки и публикации сообщений в akka кластере. Когда пользователь онлайн, он будет подписываться на сеанс; когда пользователь отправляет сообщение в сеансе, он опубликует сообщение в akka кластере, актёры, которые подписались на сеанс, получат опубликованное сообщение
- Тело сообщения websocket содержит JWT, flowFromWS используется для получения сообщения websocket и декодирования JWT;
- Если проверка JWT не пройдена, она будет транслироваться в filterFailure для фильтрации неудачных сообщений; если проверка JWT успешна, она будет транслироваться в filterSuccess для фильтрации успешных сообщений;
- При создании akka потока builder.materializedValue отправит сообщение connectedWs, connectedWs преобразует полученное сообщение в сообщение UserOnline, а затем отправит его в chatSinkActor, наконец, отправит в... Чат-актёр;
- Чат-актёр отправляет сообщение чат-сессии, когда поток акка закрыт, он отправит сообщение «UserOffline» вниз по потоку;
- Источник чата получает ответное сообщение от чат-сессии и отправляет его обратно в flowAcceptBack;
- flowAcceptBack позволяет поддерживать соединение через веб-сокет;
- Сообщения flowReject и flowAcceptBack в конечном итоге отправляются в flowBackWs, flowBackWs преобразует сообщения в формат веб-сокетов и отправляет их обратно пользователям;
*login (логин email)
nickname (никнейм)
password (пароль SHA1)
gender (пол: неизвестно:0, мальчик:1, девочка:2)
avatar (абсолютный путь аватара, пример: /upload/avatar/201610/26/xxxx.JPG)
lastLogin (последняя отметка времени входа)
loginCount (количество входов)
sessionsStatus (статус пользователя в сессиях)
[{sessionid: идентификатор сессии, newCount: количество непрочитанных сообщений в этой сессии}]
friends (список друзей пользователя: [идентификаторы друзей])
dateline (отметка времени регистрации)
*createuid (идентификатор создателя)
*ouid (идентификатор получателя, доступен, если тип сессии — приватная)
sessionIcon (значок сессии, доступен, если тип сессии — группа)
sessionType (тип сессии: 0: приватная, 1: группа)
publicType (публичный тип: 0: не публичная, 1: публичная)
sessionName (название сессии)
dateline (созданная отметка времени)
usersStatus (пользователи, которые присоединились к этой сессии)
[{uid: uid, online: (true, false)}]
lastMsgid (последний идентификатор сообщения)
lastUpdate (последняя отметка обновления)
*uid (идентификатор отправителя)
*sessionid (относительный идентификатор сессии)
msgType (тип сообщения)
content (содержание сообщения)
fileInfo (информация о файле)
{
filePath
fileName
fileType
fileSize
fileThumb
}
*dateline (созданная отметка времени)
*uid (идентификатор онлайн-пользователя)
dateline (последняя отметка обновления)
noticeType (тип уведомления: «joinFriend», «removeFriend», «inviteSession»)
senduid (идентификатор отправляющего пользователя)
*recvuid (идентификатор получающего пользователя)
sessionid (относительный идентификатор сессии)
isRead (уведомление прочитано: 0: непрочитано, 1: уже прочитано)
dateline (созданная отметка времени)
Существует два канала веб-сокетов: 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 )