Messagerie instantanée avec code

Adresse de code: https://github.com/Xavier-777/Instant-Messaging


introduction

En utilisant Sparkjava comme serveur principal, une salle de discussion instantanée développée peut envoyer des messages texte, des images, de l'audio, de la vidéo et d'autres informations, peut envoyer des fichiers zip, docx et autres, et peut même exécuter des fonctions telles que des appels vocaux et vidéo.


Introduction à Sparkjava

Sparkjava est ici un micro-framework web, qui est complètement différent de l'étincelle du big data. Si vous connaissez Node.js, alors sparkjava est facile à démarrer, car les méthodes d'écriture des deux sont très similaires, vous pouvez le comprendre comme la version Java de Node.js, mais Node.js est un non asynchrone. cadre de blocage. Sparkjava bloque de manière synchrone. (En fait, l'enseignant a demandé d'utiliser ce cadre!)


appel vidéo

L'implémentation SDK de agora.io (réseau audio) est utilisée ici, bien sûr, vous pouvez également utiliser d'autres SDK


Processus métier introduction de la fonction de projet

1. Envoi de SMS

Processus de création de lien Websocket:
Insérez la description de l'image ici

messagerie Websocket
Insérez la description de l'image ici


2. Envoi de fichiers binaires tels que vidéo et audio

Les fichiers binaires sont transférés par téléchargement de fichiers, sans le processus websocket
Insérez la description de l'image ici


3. Appel vidéo en ligne

Ici, nous utilisons le sdk de Soundnet pour implémenter cette fonction, le document de référence spécifique: https://docs.agora.io/cn/Video/landing-page?platform=Web
Dans mon projet, j'ai besoin d'écrire mon propre appId et appCertificate Pour utiliser la fonction d'appel vidéo, il est recommandé d'aller sur le site officiel pour en faire la demande. Pour plus de détails, vous pouvez accéder au document officiel


4. Mécanisme de battement de cœur

Comprenez d'abord quel est le mécanisme du rythme cardiaque.
La raison pour laquelle on l'appelle le mécanisme de battement de cœur est qu'il envoie un message au serveur à intervalles réguliers comme un battement de cœur pour indiquer au serveur que le client est toujours en vie. Il n'y a pas d'exigences fixes pour ces informations.

Il existe donc maintenant deux situations:
1. Le serveur ne répond pas et le serveur frontal ne peut pas recevoir le message du serveur principal.
2. Le serveur a répondu, mais le frontal n'a pas reçu les informations.

Pour la situation 1: la raison la plus probable est que le serveur est en panne et ne peut pas répondre, que le websocket est déconnecté et que les ressources sont libérées.
Situation 2: le serveur n'est pas en panne, mais la page Web est fermée, de sorte que les informations ne sont pas reçues, le websocket est déconnecté et les ressources sont libérées.


Par conséquent, pour obtenir la détection des pulsations, le serveur doit répondre aux informations de pulsations et le client doit également recevoir les informations.
Voici ma méthode d'implémentation:
front-end:

// 心跳检测包
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); Imprime les informations de détection des pulsations pour prouver que le client est toujours là.


extrémité arrière:

@OnWebSocketMessage
public void onMessage(Session user, String message) throws IOException {
    
    
    if (message.equals(heart)) {
    
    
        broadcastHeartCheck();
    } else {
    
    
        // 广播字符串
        broadcastMessage(Main.userUsernameMap.get(user), message);
    }
}

broadcastHeartCheck (); Une fois que le message reçu est un cœur, répondez avec les informations de pulsation correspondantes pour prouver que le serveur est toujours là.


Fonction non implémentée

1. Confirmation de l'état en ligne et traitement des messages hors ligne

Je suis allé comprendre le mécanisme de mise en œuvre et j'ai constaté que la base de données de cache redis est nécessaire pour enregistrer le statut de l'utilisateur. Lorsque l'utilisateur est en ligne, envoyez les informations directement à l'utilisateur; lorsque l'utilisateur n'est pas en ligne, enregistrez les informations dans la base de données, attendez que l'utilisateur soit en ligne, puis envoyez les informations à l'utilisateur, puis modifiez l'enregistrement de la base de données en l'état de lecture. Consultez les ressources de référence ci-dessous pour plus de détails.


2. Enregistrement en ligne de la vidéo et de la voix

Je ne l'ai pas encore compris, je suppose que cela peut être réalisé avec le SDK de Shengwang, mais je n'ai pas lu attentivement le document officiel donc je n'ose pas le confirmer. Ou utilisez un autre sdk.


Pour résumer

Les fonctions qui n'ont pas encore été implémentées dépassent le cadre de mes capacités actuelles. J'espère que dalao pourra m'aider à les atteindre, ou attendre que ma capacité s'améliore, puis implémenter lentement ces fonctions.


Matériel de référence:
Mécanisme de communication hors ligne: https://zhuanlan.zhihu.com/p/42982409
Filtre Bloom: https://zhuanlan.zhihu.com/p/43263751

Je suppose que tu aimes

Origine blog.csdn.net/lendsomething/article/details/115297139
conseillé
Classement