
فئة
### Demo


https://im.cookeem.com
تغيير إلى دليل Cookim ، قم بتشغيل الأمر أدناه ، وابدأ في العديد من الخوادم Cookim في وضع Cookim في وضع Docker. بهذه الطريقة ستبدأ 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 ، استخدم متصفحًا مختلفًا للوصول إلى عناوين URL أدناه للاتصال بـ Cookim1 و Cookim2
http: // localhost: 8080 http: // localhost: 8081
فئة
يمكنك إضافة التكوين في docker-compose.yml (في دليل Cookim) لإضافة عقد خادم Cookim ، يوضح هذا المثال كيفية إضافة Cookim3 في Docker:
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 ، يرجى التأكد من تكوين MongoDB URI الخاص بك.
mongodb {
dbname = " cookim "
uri = " mongodb://mongo:27017/local "
} مشروع Cookim Assembly إلى fatjar ، جرة مستهدفة في target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar
sbt clean assemblyفئة
يستخدم Cookim MongoDB لتخزين رسائل الدردشة وبيانات المستخدمين ، تأكد من بدء تشغيل MongoDB قبل بدء تشغيل Cookim.
هناك طريقتان لبدء Cookim Server: SBT و Java
أ. SBT Debug Way:
$ cd # CookIM directory#
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551 "ب. حزمة وتجميع جرة الدهون:
$ sbt assemblyج. طريقة إنتاج جافا:
$ 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لقد بدأ الأمر أعلاه بدء تشغيل منفذ Web Server 8080 و AKKA System Port 2551
حدود:
-a -h [-m] [-n] -s -w -a ،-Akka-port Akka cluster node port -H ،-اسم المضيف الحالي لخدمة المواقع الخارجي-mongo-uri mongodb connection uri ، مثال: mongodb: // localhost: 27017/local -n ، nat is network or in docker- مع فاصلة ، مثال: LocalHost: 2551 ، LocalHost: 2552-W ،-منفذ خدمة الويب على شبكة الإنترنت
فئة
http: // localhost: 8080
فئة
افتح محطة أخرى ، ابدأ خادمًا آخر في Cookim لاختبار اتصال الرسائل بين الخوادم:
أ. SBT Debug Way:
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551 "ب. طريقة إنتاج جافا:
$ 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لقد بدأ الأمر أعلاه بدء تشغيل منفذ Web Server 8081 و AKKA System Port 2552
فئة
http: // localhost: 8081
فئة

** Cookim Server Make من 3 أجزاء: **
- Akka HTTP: توفير خدمة الويب ، Browser Connect خوادم الدردشة الموزعة بواسطة WebSocket
- Akka Stream: AKKA HTTP تلقي رسالة WebSocket (تتضمن رسالة WebSocket TextMessage و BinaryMessage) ، ثم إرسال رسالة إلى الدردشة بواسطة Akka Stream Way ، تتضمن رسالة WebSocket JWT (JavaScript Web Token) ، إذا كان JWT تحقق من الفشل ، فإن Thatsservice Stream سوف ترجع رسالة رفض ؛ إذا تحقق JWT من النجاح ، فسيقوم ThatsService Stream بإرسال رسالة إلى ThatssessionAction
- Akka Cluster : Akka Stream أرسل رسالة WebSocket إلى Akka Cluster chatsessionactor ، chatsessionactor استخدام DistributedPubsub للاشتراك ونشر رسالة في Akka Cluster. عند جلسة المستخدم عبر الإنترنت ، سيتم الاشتراك في الجلسة ؛ عندما يرسل المستخدم رسالة في الجلسة ، سيتم نشر رسالة في Akka Cluster ، فإن الجهات الفاعلة التي تشترك في الجلسة ستتلقى رسالة النشر
فئة

- تشمل هيئة رسائل WebSocket JWT ، FlowFromws استخدام رسائل WebSocket وفك تشفير JWT ؛
- عندما تحقق JWT الفشل ، سيتم بثه إلى FilterFailure للتصفية لفشل الرسائل ؛ عندما تتحقق JWT من النجاح ، سيتم بثه إلى Filtersuccess لتصفية رسالة النجاح ؛
- عند إنشاء Akka Stream ، سوف يقوم Builder.materializedValue بإرسال رسالة إلى ConnectionWs ، و ConnectionWs تحويل الرسالة إلى رسالة UserOnline ، ثم أرسل إلى Thatsinkactor أخيرًا إرسالها إلى ChatsessionAction ؛
- إرسال رسالة إلى chatactorsink إلى chatsessionactor ، عندما يتم إغلاق Akka Stream إذا أرسل رسالة useroffline إلى Down Stream ؛
- تلقي رسالة إلى رسالة من الدردشات من الدردشة ، ثم أرسل رسالة إلى FlowAcstepback ؛
- سوف يترك FlowAcstepback اتصال WebSocket Keepalive ؛
- ترسل رسائل FlowReject و FlowAcstepback أخيرًا إلى 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"
}
فئة
فئة
فئة
فئة