コードアドレス:https://github.com/Xavier-777/Instant-Messaging
前書き
開発されたインスタントチャットルームは、Sparkjavaをバックエンドサーバーとして使用して、テキストメッセージ、画像、オーディオ、ビデオ、その他の情報を送信したり、zip、docx、その他のファイルを送信したり、音声通話やビデオ通話などの機能を実行したりできます。
Sparkjavaの概要
ここでのSparkjavaは、ビッグデータスパークとは完全に異なるマイクロWebフレームワークです。Node.jsを知っている場合は、sparkjavaを簡単に開始できます。これは、2つの書き込み方法が非常に似ているため、Node.jsのJavaバージョンとして理解できますが、Node.jsは非同期の非非同期です。フレームワークをブロックしています。Sparkjavaは同期的にブロックしています。(実際、先生はこのフレームワークを使用するように依頼しました!)
ビデオ通話
ここでは、agora.io(サウンドネットワーク)のSDK実装が使用されています。もちろん、他のSDKを使用することもできます。
プロジェクト機能のビジネスプロセス導入
1.テキストメッセージの送信
Websocketリンク作成プロセス:
WebSocketメッセージング
2.ビデオやオーディオなどのバイナリファイルの送信
バイナリファイルは、WebSocketプロセスなしで、ファイルのアップロードによって転送されます
3.オンラインビデオ通話
ここでは、SoundnetのSDKを使用して、この関数、特定のリファレンスドキュメントを実装します。https:
//docs.agora.io/cn/Video/landing-page?platform = Web私のプロジェクトでは、独自のappIdとappCertificateビデオ通話機能を利用するには、公式サイトにアクセスして申請することをお勧めします。詳細については、公式文書をご覧ください。
4.ハートビートメカニズム
まず、ハートビートメカニズムとは何かを理解します。
ハートビートメカニズムと呼ばれる理由は、ハートビートのように定期的にサーバーにメッセージを送信して、クライアントがまだ生きていることをサーバーに通知するためです。この情報に固定の要件はありません。
したがって、2つの状況があり
ます。1。サーバーが応答せず、フロントエンドがバックエンドからメッセージを受信できない。
2.サーバーは応答しましたが、フロントエンドは情報を受信しませんでした。
状況1の場合:最も可能性の高い理由は、サーバーがダウンして応答できないこと、WebSocketが切断されていること、およびリソースが解放されていることです。
状況2:サーバーはダウンしていませんが、Webページが閉じているため、情報が受信されず、WebSocketが切断され、リソースが解放されます。
したがって、ハートビート検出を実現するには、サーバーがハートビート情報に応答し、クライアントも情報を受信する必要があります。
実装方法は次のとおりです。
フロントエンド:
// 心跳检测包
var heartCheck = {
timeout: 30000, //30秒发一次心跳
timeoutObj: null,
serverTimeoutObj: null,
reset: function(){
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
this.start();
},
start: function(){
var self = this;
this.timeoutObj = setTimeout(function(){
//这里发送一个心跳,后端收到后,返回一个心跳消息,
//onmessage拿到返回的心跳就说明连接正常
ws.send("ping");
self.serverTimeoutObj = setTimeout(function(){
//如果超过一定时间还没重置,说明后端主动断开了
ws.close(); //如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
}, self.timeout)
}, this.timeout)
}
}
webSocket.onopen = function () {
heartCheck.reset(); //心跳检测
};
webSocket.onmessage = function (msg) {
var data = JSON.parse(msg.data);
if (data.heartCheck) {
console.log(data); //获取心跳json
} else {
updateChat(data);//解析json,并更新聊天列表
}
heartCheck.reset(); //心跳检测
};
console.log(data);ハートビート検出情報を出力して、クライアントがまだそこにあることを証明します。
後部:
@OnWebSocketMessage
public void onMessage(Session user, String message) throws IOException {
if (message.equals(heart)) {
broadcastHeartCheck();
} else {
// 广播字符串
broadcastMessage(Main.userUsernameMap.get(user), message);
}
}
BroadcastHeartCheck();受信したメッセージがハートになった後、対応するハートビート情報で応答して、サーバーがまだそこにあることを証明します。
未実装の機能
1.オンラインステータス確認とオフラインメッセージ処理
実装メカニズムを理解したところ、ユーザーのステータスを記録するためにredisキャッシュデータベースが必要であることがわかりました。ユーザーがオンラインの場合は、情報をユーザーに直接送信します。ユーザーがオンラインでない場合は、情報をデータベースに保存し、ユーザーがオンラインになるまで待ってから、情報をユーザーに送信してから、データベースレコードを次のように変更します。読み取り状態。詳細については、以下のリファレンスリソースを参照してください。
2.ビデオと音声のオンライン録音
まだわかりません。ShengwangのSDKで実現できると思いますが、公式文書をよく読んでいないので、あえて確認していません。または、他のSDKを使用します。
総括する
まだ実装されていない機能は、現在の機能の範囲を超えています。dalaoがそれらの達成に役立つか、機能が向上するのを待ってから、ゆっくりとこれらの機能を実装してくれることを願っています。
参考資料:
オフライン通信メカニズム:https://zhuanlan.zhihu.com/p/42982409
ブルームフィルター:https://zhuanlan.zhihu.com/p/43263751