
Catégorie
### démo


https://im.cookeem.com
Changez en répertoire CookIm, exécutez la commande ci-dessous, démarrez plusieurs nœuds Cookim Serveurs en mode Docker Compose. Cette façon commencera 3 conteneurs: Mongo, Cookim1 et Cookim2
$ git clone https://github.com/cookeem/CookIM.git
$ cd CookIM
$ sudo docker-compose up -d
Creating mongo
Creating cookim1
Creating cookim2Après l'exécution de Docker Compose, utilisez différents navigateurs pour accéder aux URL ci-dessous pour vous connecter à CookIm1 et CookIm2
http: // localhost: 8080 http: // localhost: 8081
Catégorie
Vous pouvez ajouter une configuration dans docker-compose.yml (dans le répertoire Cookim) pour ajouter des nœuds de serveur Cookim, cet exemple montre comment ajouter CookIm3 dans 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
- cookim1Catégorie
Afficher la sortie des journaux cookim1
$ sudo docker logs -f cookim1 Exec dans Container cookim1 pour déboguer
$ sudo docker exec -ti cookim1 bashCatégorie
$ sudo docker-compose stop
$ sudo docker-compose rmCatégorie
Catégorie
git clone https://github.com/cookeem/CookIM.git
cd CookIMCatégorie
Le fichier de configuration se localise sur conf/application.conf , veuillez vous assurer que votre configuration URI MongoDB.
mongodb {
dbname = " cookim "
uri = " mongodb://mongo:27017/local "
} Assemblage du projet Cookim vers un pot de Fatjar, Jar Target Localisez à target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar
sbt clean assemblyCatégorie
Cookim utilise MongoDB pour stocker les messages de chat et les données des utilisateurs, assurez-vous de démarrer MongoDB avant de démarrer Cookim.
Il existe deux façons de démarrer Cookim Server: SBT et Java
un. SBT Debug Way:
$ cd # CookIM directory#
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551 "né Pack et compiler un pot de graisse:
$ sbt assemblyc. 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:2551La commande ci-dessus a démarré un serveur Web Écouter le port 8080 et Akka System Listen Port 2551
Paramètres:
-a -h [-m] [-n] -s -w -a, - Akka-Port Akka Cluster Node Port -H, - Nom de la connexion Web actuelle du service Web actuel -M, - Mongo-Uri MongoDB Connexion URI, Exemple: MongoDB: // LocalHost: 27017 / Local -N, - Nat est Nat Nata avec virgule, exemple: localhost: 2551, localhost: 2552 -w, - port de service Web de port Web
Catégorie
http: // localhost: 8080
Catégorie
Ouvrez un autre terminal, démarrez un autre serveur Cookim pour tester la communication des messages entre les serveurs:
un. SBT Debug Way:
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551 "né 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:2551La commande ci-dessus a démarré un serveur Web Écouter le port 8081 et Akka System Listen Port 2552
Catégorie
http: // localhost: 8081
Catégorie

** Cookim Server à partir de 3 parties: **
- AKKA HTTP: Fournir un service Web, Browser Connect Distributed Chat serveurs par WebSocket
- AKKA Stream: AKKA HTTP reçoit le message WebSocket (le message WebSocket inclut TextMessage et BinaryMessage), puis envoyez le message à ChatService par Akka Stream Way, le message WebSocket inclut JWT (Token Web JavaScript), si JWT Vérifiez l'échec, ChatService Stream renvoie le message Reject; Si JWT vérifie le succès, ChatService Stream enverra un message à ChatSessionActor
- CLUSTER AKKA : Akka Stream Envoyer un message WebSocket à AKKA Cluster ChatSessionActor, ChatSessionActor Utilisez DistributedPubSub pour abonner et publier un message dans Akka Cluster. Lorsque l'utilisateur en ligne, il abonnera la session; Lorsque l'utilisateur envoie un message en session, il publiera un message dans Akka Cluster, les acteurs qui souscrivent la session recevront le message de publication
Catégorie

- Le corps de message WebSocket inclut JWT, FlowFromws utilise pour recevoir le message WebSocket et Decode JWT;
- Lorsque JWT vérifie la défaillance, il diffusera pour filtrerfailure pour filtrer le message échoué; Lorsque JWT vérifiera le succès, il diffusera pour filtrer le message de filtre à Success;
- Lorsque AKKA Stream a créé, Builder.MaterializedValue enverra un message à ConnectedWS, ConnectedWS convertit le message Recevoir dans UserOnline Message, puis envoyez à ChatsInkactor Envoyer enfin à ChatSessionActor;
- ChatactorsInk Envoyez un message à ChatSessionActeur, lorsque le flux AKKA fermé si vous enverra un message UserOffline à la baisse;
- Chatsource reçoit le message de ChatSessionActor, puis renvoie le message à FlowAcceptBack;
- FlowAcceptBack permettra à la connexion WebSocket Keepalive;
- Les messages FlowReject et FlowACceptback enfin sont enfin envoyés à FlowbackWS, Flowbackws convertissent les messages au format WebSocket puis renvoie aux utilisateurs;
Catégorie
*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)
Catégorie
Il y a deux canaux WebSocket: WS-push et WS-chat
WS-Push Envoyer des sessions de nouveaux messages aux utilisateurs, lorsque l'utilisateur n'est pas en ligne la session, ils peuvent toujours recevoir les sessions qui ont de nouveaux messages
/ canal 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"
}
Catégorie
WS-chat est la chaîne de chat de session, l'envoi de l'utilisateur et reçoivent des messages de session dans ce canal
/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"
}
Catégorie
Catégorie
Catégorie
Catégorie