C # implémente la messagerie instantanée sur Linux (UOS, Galaxy Kirin) (code source de démonstration)

Sur la base de .NET Core, nous pouvons implémenter des programmes de messagerie instantanée multiplateformes, prendre en charge l'exécution sur des systèmes d'exploitation nationaux tels que Tongxin UOS et Yinhe Kirin, et nous adapter aux processeurs nationaux, tels que Loongson, Kunpeng, Haiguang et d'autres puces. Voyons comment y parvenir.

Tout d'abord, le diagramme d'effet de l'exécution côté client :

Les interfaces utilisateur du client .NET (WPF), du client Linux (.NET Core) et du client Web (JS) inclus dans cette démo sont totalement cohérentes.

La couche inférieure de l'interface utilisateur sous Linux utilise SkiaSharp et CPF, et le composant ESFramework.ChatRendering est utilisé pour le rendu des messages de chat.

1. Fonctions principales de démonstration

Les fonctions de chat à démontrer dans cette démo incluent :

(1) Avertir les autres utilisateurs en ligne lorsque l'utilisateur client se connecte ou se déconnecte.
(2) Lorsque le client est déconnecté du réseau du serveur, il se reconnecte automatiquement et lorsque le réseau est restauré, la reconnexion réussit.
(3) Tous les utilisateurs en ligne peuvent mener des discussions textuelles (prise en charge des émoticônes, prise en charge du retrait des messages, suppression des messages).
(4) Transfert de fichiers.
(5) Canal P2P.
(6) Appel synchrone de message.
(7) Mode de reconnexion. Lorsqu'un utilisateur portant le même nom se connecte, les utilisateurs précédents seront évincés.

2. Réalisation de la fonction

1. Déterminez si vous avez besoin de la fonctionnalité Contacts

(1) Déterminer si une relation de contact est requise. Dans cette démo, nous partons du principe que tous les utilisateurs en ligne sont en contact les uns avec les autres.

(2) Déterminer si le regroupement est nécessaire. Dans cette démo, nous n'avons pas besoin de diffuser des messages, et nous n'avons pas besoin de grouper.

Combinez (1) et (2), afin de pouvoir utiliser directement le DefaultContactsManager fourni par ESFramework.

2. Définir le type d'informations

    Dans cette démo, nous définissons 4 types d'informations, qui représentent respectivement les messages de chat texte, les messages image, les messages de retrait, et le client appelle le serveur de manière synchrone. Il est défini comme suit :

    public static class InformationTypes
    {
        /// <summary>
        /// 文字表情聊天信息
        /// </summary>
        public const int EmotionTextChat = 0;

        /// <summary>
        /// 图片聊天信息
        /// </summary>
        public const int ImageChat = 1;

        /// <summary>
        /// 撤回消息
        /// </summary>
        public const int RecallMsg = 10;              

        /// <summary>
        /// 同步调用
        /// </summary>
        public const int ClientSyncCallServer = 101;

    }

Étant donné que la définition d'InformationTypes et la classe de protocole d'information définie ensuite doivent être utilisées à la fois par le client et le serveur, nous les plaçons dans un projet séparé ESFramework.EntranceDemo.Core, qui peut être référencé à la fois par le client et le serveur.

3. Définir la classe de protocole

Une fois le type d'informations défini, nous définissons ensuite le protocole d'informations.

Pour les messages de chat (InformationTypes.EmotionTextChat), une classe de protocole est spécialement définie : EmotionTextChatContract.     

Pour l'appel synchrone (InformationTypes.ClientSyncCallServer), notre exemple consiste à demander le résultat de l'opération d'addition au serveur, et la classe de protocole utilise MathModel.

4. Implémenter un processeur d'informations personnalisé

Le MainForm du client implémente l'interface ICustomizeHandler, qui implémente principalement la méthode HandleInformation pour traiter les messages de chat reçus et les rappels de vibration.

  void HandleInformation(string sourceUserID, int informationType, byte[] info);

Le CustomizeHandler sur le serveur implémente l'interface ICustomizeHandler sur le serveur, qui implémente principalement la méthode HandleQuery pour gérer les appels synchrones du client (InformationTypes.ClientCallServer).

  byte[] HandleQuery(string sourceUserID, int informationType, byte[] info);

5. Le serveur vérifie le compte connecté par l'utilisateur

La classe BasicHandler sur le serveur implémente l'interface IBasicHandler pour vérifier le mot de passe du compte de l'utilisateur connecté.

Dans cette démo, on suppose que toutes les vérifications sont réussies, de sorte que la méthode de vérification renvoie directement true.

6. Logique de base du client

(1) Gérer les événements de changement d'état

Dans la méthode Initialize de MainForm, le client préordonne les événements de changement d'état de connexion exposés par le moteur client Rapid, tels que la déconnexion de la connexion, le démarrage de la reconnexion, le succès de la reconnexion et l'achèvement de la reconnexion.

De plus, le client pré-commande également les événements de changement d'état associés de IBasicOutter et IContactsOutter pour gérer les notifications de déconnexion du contact, d'être poussé hors de la ligne, d'être expulsé, etc.

(2) Créer un canal P2P

Chaque fois que vous double-cliquez sur l'avatar d'un ami et qu'une fenêtre de discussion apparaît, essayez d'établir un canal P2P avec l'autre partie :

   //尝试与目标用户建立P2P通道
   this.rapidPassiveEngine.P2PController.P2PConnectAsyn(dc.ID);

(3) Envoyer des messages de chat 

    Utilisez la méthode Send de CustomizeOutter de IRapidPassiveEngine pour envoyer des messages de chat avec des émoticônes textuelles. 

     Il existe deux boutons d'envoi, "Envoyer 1" et "Envoyer 2", qui illustrent respectivement deux façons de s'envoyer des messages :

(1) Envoyez-le directement à l'autre partie. (Si le canal P2P existe, il sera envoyé via le canal P2P)

(2) Envoyez-le d'abord au serveur, puis transférez-le à l'autre partie par le serveur.     

        /// <summary>
        /// 向服务器发送信息。
        /// </summary>
        /// <param name="informationType">自定义信息类型</param>
        /// <param name="info">信息</param>
        void Send(int informationType, byte[] info);

        /// <summary>
        /// 向在线用户targetUserID发送信息。
        /// </summary>
        /// <param name="targetUserID">接收消息的目标用户ID</param>
        /// <param name="informationType">自定义信息类型</param>
        /// <param name="info">信息</param>      
        void Send(string targetUserID, int informationType, byte[] info);

(4) Transférer des fichiers

      Dans la fenêtre de chat, cliquez sur le bouton pour envoyer des fichiers, et vous pouvez sélectionner les fichiers à envoyer. Envoyez des fichiers via la méthode BeginSendFile de FileOutter de IRapidPassiveEngine :

        /// <summary>
        /// 发送方准备发送文件(夹)。
        /// </summary>
        /// <param name="accepterID">接收文件(夹)的用户ID</param>
        /// <param name="fileOrDirPath">被发送文件(夹)的路径</param>    
        /// <param name="comment">其它附加备注。</param>       
        /// <param name="projectID">返回文件传送项目的编号</param>
        void BeginSendFile(string accepterID, string fileOrDirPath, string comment, out string projectID);

3. Serveur

Le serveur utilise directement le formulaire principal par défaut MainServerForm fourni par ESFramework.Boost pour afficher les informations sur l'état de l'utilisateur en ligne.

   //如果不需要默认的UI显示,可以替换下面这句为自己的Form
   MainServerForm mainForm = new MainServerForm(RapidServerEngine);

Une fois le serveur en cours d'exécution, la capture d'écran de l'interface utilisateur est la suivante :

4. Téléchargement du code source 

Code source ESFramework.EntranceDemo

Le package de code source comprend les éléments suivants :

(1) Serveur Windows de la démo (.NET)

(2) Serveur Linux (basé sur .NetCore)

(3) Client .NET (WPF)

(4) Client Linux (basé sur .NetCore)

(5) Côté Web (JS).   

おすすめ

転載: blog.csdn.net/zhuweisky/article/details/123041278
おすすめ