
カテゴリ
###デモ


https://im.cookeem.com
Cookim Directoryに変更し、下のコマンドを実行し、Docker Composeモードで複数のノードCookimサーバーを開始します。この方法では、3つのコンテナが開始されます:Mongo、Cookim1、Cookim2
$ git clone https://github.com/cookeem/CookIM.git
$ cd CookIM
$ sudo docker-compose up -d
Creating mongo
Creating cookim1
Creating cookim2Run docker Compose後、異なるブラウザを使用して以下のURLにアクセスしてCookim1とCookim2に接続します
http:// localhost:8080 http:// localhost:8081
カテゴリ
docker-compose.yml (cookimディレクトリ内)にconfigを追加してCookim Serverノードを追加できます。この例は、Docker ComposeにCookim3を追加する方法を示しています。
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コンテナcookim1にexec debug
$ 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にあります。MongoDBURI構成を確認してください。
mongodb {
dbname = " cookim "
uri = " mongodb://mongo:27017/local "
}ターゲットジャーへのアセンブリクッキープロジェクト、ターゲットジャーはtarget/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jarでロケートします
sbt clean assemblyカテゴリ
CookimはMongodbを使用してチャットメッセージとユーザーデータを保存します。SpartupCookimの前にMongodbを起動してください。
Cookim Serverを開始するには2つの方法があります:SBTとJava
a。 SBTデバッグウェイ:
$ cd # CookIM directory#
$ sbt " run-main com.cookeem.chat.CookIM -h localhost -w 8080 -a 2551 -s localhost:2551 "b。脂肪瓶を詰め込んでコンパイルします:
$ sbt assemblyc。 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上記のコマンドがWebサーバーを開始しましたポート8080を聞き、Akkaシステムをリッスンポート2551
パラメーター:
-a -h [-m] [-n] -s -w -a、-akka-port akka cluster node node port -h、 - host-name current webサービス外部ホスト名-m、 - mongo-uri mongodb connection uri、例:mongodb:// localhost:27017/local -n、 - nat is nat is in in nat is in inコンマと分離、例:localhost:2551、localhost:2552 -w、 - ウェブポートWebサービスポート
カテゴリ
http:// localhost:8080
カテゴリ
別の端末を開き、別の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上記のコマンドがWebサーバーを開始しましたポート8081を聞き、Akkaシステムをリッスンポート2552
カテゴリ
http:// localhost:8081
カテゴリ

** 3つの部品からのCookim Server Make:**
- akka http:Webサービス、ブラウザConnect分散チャットサーバーをWebSocketで提供する
- Akkaストリーム:Akka HTTPはWebSocketメッセージを受信します(WebSocketメッセージにはTextMessageとBinaryMessageを含む)、Akka Stream WayによってChatServiceにメッセージを送信します。WebSocketメッセージにはJWT(JavaScript Webトークン)が含まれます。 JWTが成功を確認した場合、ChatServiceストリームはChatSessionActorにメッセージを送信します
- Akka Cluster:Akka Streamは、Akka Cluster ChatSessionactorにWebSocketメッセージを送信します。ChatSessionActorは、Akka Clusterでメッセージをサブスクライブして公開します。ユーザーオンラインセッションの場合、セッションを購読します。ユーザーがセッションでメッセージを送信すると、Akka Clusterでメッセージを公開し、セッションを購読するアクターが公開メッセージを受信します
カテゴリ

- WebSocketメッセージ本文にはJWTが含まれ、WebSocketメッセージを受信してJWTをデコードするために使用されます。
- JWTが障害を確認すると、メッセージをフィルタリングするためにブロードキャストして、メッセージを失敗させるためにフィルタリングします。 JWTが成功を確認すると、FilterSuccessにブロードキャストして成功メッセージにフィルタリングします。
- Akkaストリームが作成されると、Builder.MaterializedValueはConnectedWsにメッセージを送信し、ConnectedWsメッセージをuserOnlineメッセージに変換し、Chatsinkactorに送信して最終的にChatSessionactorに送信します。
- ChatActorSorsinkは、chatsessionactorにメッセージを送信します。
- ChatSourceはChatSessionActorからメッセージを受け取り、FlowAcceptbackにメッセージを送信します。
- FlowAcceptbackは、WebSocket ConnectionのKeepAliveを可能にします。
- FlowRejectおよびFlowAcceptbackメッセージは最終的にFlowBackWSに送信し、FlowBackWはメッセージを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)
カテゴリ
WS-PushとWS-Chatの2つのWebSocketチャネルがあります
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"
}
カテゴリ
カテゴリ
カテゴリ
カテゴリ