コードを使用したインスタントメッセージング

コードアドレス: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

おすすめ

転載: blog.csdn.net/lendsomething/article/details/115297139