
Категория
### Демо


https://im.cokeem.com
Измените в каталог Cookim, запустите команду ниже, запустите несколько узлов CookiM Servers в режиме Docker Compose. Таким образом начнется 3 контейнер: Mongo, Cookim1 и Cookim2
$ git clone https://github.com/cookeem/CookIM.git
$ cd CookIM
$ sudo docker-compose up -d
Creating mongo
Creating cookim1
Creating cookim2После запуска Docker Compose используйте разные браузера для доступа к URL -адресам ниже, чтобы подключиться к Cookim1 и Cookim2
http: // localhost: 8080 http: // localhost: 8081
Категория
Вы можете добавить config в docker-compose.yml (в каталоге Cookim), чтобы добавить узлы сервера Cookim, этот пример показывает, как добавить Cookim3 в Docker Compose:
cookim3 :
image : cookeem/cookim
container_name : cookim3
hostname : cookim3
environment :
HOST_NAME : cookim3
WEB_PORT : 8080
AKKA_PORT : 2551
SEED_NODES : cookim1:2551
MONGO_URI : mongodb://mongo:27017/local
ports :
- " 8082:8080 "
depends_on :
- mongo
- cookim1Категория
Посмотреть контейнер cookim1
$ sudo docker logs -f cookim1 Exec в контейнер cookim1 для отладки
$ sudo docker exec -ti cookim1 bashКатегория
$ sudo docker-compose stop
$ sudo docker-compose rmКатегория
Категория
git clone https://github.com/cookeem/CookIM.git
cd CookIMКатегория
Поиск файла конфигурации на conf/application.conf , пожалуйста, убедитесь, что ваша конфигурация URI MongoDB.
mongodb {
dbname = " cookim "
uri = " mongodb://mongo:27017/local "
} Проект Cookly Cookmy Pooks в Fatjar, целевой банок, расположенный в target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar
sbt clean assemblyКатегория
Cookim используйте MongoDB для хранения сообщений чата и пользователей, убедитесь, что вы запустите MongoDB перед запуском Cookim.
Есть два способа начать сервер Cookim: SBT и Java
а SBT отладка:
$ cd # CookIM directory#
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551 "беременный Упакуйте и собирайте жирную банку:
$ sbt assemblyв Java Production Way:
$ 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 System Listen Port 2551
Параметры:
-a -h [-m] [-n] -s -w -a,-akka-port akka cluster cluster node-hort -h,-connection-hing-name-name vember service-service-most host -m,-mongo-uri mongodb connect С запятой, пример: Localhost: 2551, Localhost: 2552 -W,-порт веб-сервисной службы веб-порта
Категория
http: // localhost: 8080
Категория
Откройте еще один терминал, запустите другой сервер Cookim, чтобы проверить связь между сообщениями между серверами:
а SBT отладка:
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551 "беременный Java Production Way:
$ 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 System Listen Port 2552
Категория
http: // localhost: 8081
Категория

** Cookim Server сделан из 3 частей: **
- Akka http: Предоставьте веб -сервис, браузер Connect Distributed Chat Servers By WebSocket
- Akka Stream: Akka http получает сообщение WebSocket (сообщение WebSocket включает в себя TextMessage и BinaryMessage), затем отправьте сообщение в ChatService по Akka Stream Way, сообщение WebSocket включает в себя JWT (JavaScript Web Token), если JWT проверяет неудачу, stream stream watservice вернется; Если JWT подтвердит успех, Chatservice Stream отправит сообщение в ChatsessionActor
- Akka Cluster : Akka Stream Отправить сообщение WebSocket в Akka Cluster ChatsessionActor, CatsessionActor Использовать DistributedPubSub для подписки и публикации сообщения в Akka Cluster. При сеансе пользователя онлайн он подпишится на сеанс; Когда пользователь отправит сообщение в сессии, оно опубликует сообщение в Akka Cluster, актеры, которые подписывают сеанс, получат сообщение о публикации
Категория

- Тело сообщения Websocket включает JWT, FlowFromWS для получения сообщения WebSocket и DeCode JWT;
- Когда JWT проверяет отказ, он будет транслироваться в Filectfailure для фильтрации для сбоя сообщений; Когда JWT проверяет успех, он будет транслироваться для фильтрации для фильтрации в сообщение об успехе;
- Когда Akka Stream будет создан, Builder.materializedValue отправит сообщение в ContenceWS, ConnectWs конвертируют сообщение о получении в сообщение userOnline, а затем отправьте в чата, наконец, отправить в ChatsessionActor;
- ChatactorsInk Отправить сообщение в ChatsessionActor, когда Akka Stream закрыт, если отправит сообщение userOffline в Down Stream;
- Чатсурс получает сообщение обратно от ChatsessionActor, затем отправьте сообщение обратно в Flowacceptback;
- Flowaccectback позволит подключению WebSocket Connection;
- Сообщения Flowreject и Flowacceptack Наконец -то отправляются в Flowbackws, Flowbackws конвертируют сообщения в формат WebSocket, а затем отправляют обратно пользователям;
Категория
*login (login email)
nickname (nickname)
password (password SHA1)
gender (gender: unknow:0, boy:1, girl:2)
avatar (avatar abs path, example: /upload/avatar/201610/26/xxxx.JPG)
lastLogin (last login timestamp)
loginCount (login counts)
sessionsStatus (user joined sessions status)
[{sessionid: session id, newCount: unread message count in this session}]
friends (user's friends list: [friends uid])
dateline (register timestamp)
*createuid (creator uid)
*ouid (receiver uid, when session type is private available)
sessionIcon (session icon, when session type is group available)
sessionType (session type: 0:private, 1:group)
publicType (public type: 0:not public, 1:public)
sessionName (session name)
dateline (created timestamp)
usersStatus (users who joined this session status)
[{uid: uid, online: (true, false)}]
lastMsgid (last message id)
lastUpdate (last update timestamp)
*uid (send user uid)
*sessionid (relative session id)
msgType (message type)
content (message content)
fileInfo (file information)
{
filePath
fileName
fileType
fileSize
fileThumb
}
*dateline (created timestamp)
*uid (online user id)
dateline (last update timestamp)
noticeType (notification type: "joinFriend", "removeFriend", "inviteSession")
senduid (send user id)
*recvuid (receive user id)
sessionid (relative session id)
isRead (notification is read: 0:not read, 1:already read)
dateline (created timestamp)
Категория
Есть два канала WebSocket: WS-Push и WS-Chat
WS-Push Отправить сеансы Новое сообщение пользователям, когда пользователь не онлайн сеанс, они все еще могут получить, какие сессии имеют новые сообщения
/WS-Push-канал
up message, use to subscribe push message:
{ 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: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "xxx", sessionIcon: "xxx", msgType: "system", content: "xxx", dateline: "xxx" }
message push to browser:
pushMsg: {
uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "xxx",
content: "xxx", fileName: "xxx", fileType: "xxx", fileid: "xxx", thumbid: "xxx",
dateline: "xxx"
}
Категория
WS-Chat-это канал чата сеанса, Пользовательская отправка и получение сообщений сеанса на этом канале
/ws-chat channel
up message:
onlineMsg: { userToken: "xxx", sessionToken: "xxx", msgType:"online", content:"" }
textMsg: { userToken: "xxx", sessionToken: "xxx", msgType:"text", content:"xxx" }
fileMsg: { userToken: "xxx", sessionToken: "xxx", msgType:"file", fileName:"xxx", fileSize: 999, fileType: "xxx" }<#BinaryInfo#>binary_file_array_buffer
down message:
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: { uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "xxx", sessionIcon: "xxx", msgType: "system", content: "xxx", dateline: "xxx" }
message push to browser:
chatMsg: {
uid: "xxx", nickname: "xxx", avatar: "xxx", msgType: "xxx",
content: "xxx", fileName: "xxx", fileType: "xxx", fileid: "xxx", thumbid: "xxx",
dateline: "xxx"
}
Категория
Категория
Категория
Категория