
Kategorie
###Demo


https://im.cookeem.com
Wechseln Sie in das Cookim -Verzeichnis, führen Sie den Befehl unten aus und starten Sie mehrere Knoten -Cookim -Server im Docker -Kompose -Modus. Auf diese Weise startet 3 Container: Mongo, Cookim1 und Cookim2
$ git clone https://github.com/cookeem/CookIM.git
$ cd CookIM
$ sudo docker-compose up -d
Creating mongo
Creating cookim1
Creating cookim2Verwenden Sie nach dem Auslauf von Docker Compose einen anderen Browser, um auf die unten stehenden URLs zuzugreifen, um eine Verbindung zu Cookim1 und Cookim2 herzustellen
http: // localhost: 8080 http: // localhost: 8081
Kategorie
Sie können Konfiguration in docker-compose.yml (im Cookim-Verzeichnis) hinzufügen, um Cookim-Server-Knoten hinzuzufügen. In diesem Beispiel wird angezeigt, wie Cookim3 in Docker Compose hinzugefügt wird:
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
- cookim1Kategorie
Container cookim1 -Protokolle Ausgabe anzeigen
$ sudo docker logs -f cookim1 Exec in Container cookim1 um zu debuggen
$ sudo docker exec -ti cookim1 bashKategorie
$ sudo docker-compose stop
$ sudo docker-compose rmKategorie
Kategorie
git clone https://github.com/cookeem/CookIM.git
cd CookIMKategorie
Die Konfigurationsdatei finden Sie bei conf/application.conf . Stellen Sie bitte Ihre MongoDB -URI -Konfiguration sicher.
mongodb {
dbname = " cookim "
uri = " mongodb://mongo:27017/local "
} Assembly Cookim-Projekt zu einem Fatjar-Ziel-Jar-Lokal in target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar
sbt clean assemblyKategorie
Cookim verwendet MongoDB, um Chat -Nachrichten und Benutzerdaten zu speichern. Stellen Sie sicher, dass Sie MongoDB starten, bevor Sie Cookim starten.
Es gibt zwei Möglichkeiten, um Cookim Server zu starten: SBT und Java
A. SBT -Debug -Weg:
$ cd # CookIM directory#
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551 "B. Packen und kompilieren Sie Fat Jar:
$ 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:2551Der Befehl oben hat einen Webserver -Listen -Port 8080 und das Akka System Listenport 2551 gestartet. 2551
Parameter:
-a -h [-m] [-n] -s -w -a,-Akka-Port Akka Cluster-Knoten-Port -h,-Hostname Aktueller Webdienst externer Hostname -m,-Mongo-uri MongoDB-Verbindung URI, Beispiel: MongoDb: // Localhost: 27017/Lokal-Nat,-Nat-NAT-NAT-NAT-NAT-NAT-NATE-NATTEL-NATTEL-NATUM-NATUM-NATUM-NATS-NAT-NATION-NATION-NATION-NATION-NATION-NATUM-NATUM-NAT-NATUM-NATUM-NAT-NATUM-NAT-NATUM-NAT. Trennend mit Komma, Beispiel: Localhost: 2551, Localhost: 2552 -W,-Web-Port-Web-Service-Port
Kategorie
http: // localhost: 8080
Kategorie
Öffnen Sie ein anderes Terminal und starten Sie einen anderen Cookim -Server, um die Nachrichtenkommunikation zwischen Servern zu testen:
A. SBT -Debug -Weg:
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551 "B. 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:2551Der obige Befehl hat einen Webserver -Listen -Port 8081 und das Akka System Listenport 2552 gestartet. 2552
Kategorie
http: // localhost: 8081
Kategorie

** Cookim Server machen aus 3 Teilen: **
- AKKA HTTP: Geben
- Akka -Stream: Akka HTTP Empfangen Sie WebSocket -Nachricht (WebSocket -Nachricht enthalten TextMessage und BinaryMessage) und senden Sie eine Nachricht an ChatService per akka Stream Way. Wenn JWT den Erfolg überprüfen, sendet der ChatService -Stream eine Nachricht an ChatsesionActor
- Akka -Cluster: Akka Stream senden Sie die WebSocket -Nachricht an Akka Cluster ChatsesionActor, ChatsesionActor verwenden DistantPubsub, um die Nachricht in Akka -Cluster zu abonnieren und zu veröffentlichen. Bei der Online -Sitzung der Benutzer wird die Sitzung abonniert. Wenn Benutzer die Nachricht in Sitzung senden, veröffentlicht sie die Nachricht in AKKA Cluster. Die Akteure, die die Sitzung abonnieren, erhalten die Veröffentlichungsnachricht
Kategorie

- Die WebSocket -Nachricht beinhaltet JWT, FlowFromWs verwendet, um WebSocket -Nachricht zu empfangen und JWT zu dekodieren.
- Wenn JWT den Fehler überprüft, wird es an FilterFailure zum Filter gesendet, um die Nachricht zu fehlenden. Wenn JWT den Erfolg überprüft, wird es an Filtersuccess übertragen, um die Erfolgsnachricht zu filtern.
- Wenn der Akka -Stream erstellt wurde, sendet Builder.MaterialializedValue eine Nachricht an ConnectedWs, ConvertedWS -Nachrichten, die an userOnline -Nachricht empfangen werden, und dann an den Chatsinkaktor senden, der schließlich an den ChatsessionActor gesendet wird.
- ChatactorSink senden Sie eine Nachricht an ChatsesionActor, wenn Akka -Stream geschlossen wird, wenn die BenutzerOffline -Nachricht an Stream sendet.
- ChatSource erhalten Sie eine Nachricht von ChatsesionActor zurück und senden Sie die Nachricht zurück an Flowacceptback.
- Durch Flowacceptback wird die Websocket -Verbindung Kleiderlebnis ermöglicht.
- FlowReject und Flowacceptback -Nachrichten senden schließlich an Flowbackws, Flowbackws konvertieren Nachrichten in das WebSocket -Format und senden dann an Benutzer zurück.
Kategorie
*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)
Kategorie
Es gibt zwei WebSocket-Kanal: WS-Push und WS-CHAT
WS-Push Send Sessions Neue Nachricht an Benutzer an Benutzer, wenn Benutzer die Sitzung nicht online ist, können sie weiterhin erhalten, welche Sitzungen neue Nachrichten haben
/WS-Push-Kanal
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"
}
Kategorie
WS-CHAT ist Session-Chat-Kanal, Benutzer senden und empfangen Sitzungsmeldungen in diesem Kanal
/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"
}
Kategorie
Kategorie
Kategorie
Kategorie