基于Tars高并发IM系统的设计与实现-实战篇6

news2024/11/28 22:52:19

基于Tars高并发IM系统的设计与实现-实战篇6

客户端设计实现

客户端采用跨平台SDK+原生UI的方案。
此处重点介绍SDK实现,UI用户可以根据自己需求进行开发。

方案架构图:

在这里插入图片描述

方案实现:

  • TCP链接
    CTcpSocket
    CSSLSocket

  • 长链接维护、数据收发
    CTNSendRecvThread

  • OMTP数据报文处理
    CTNProcessThread

  • 日志记录
    CLog

  • SDK对外接口及回调接口
    ITnImSdkCallback

 /**
     * OMTP回调接口
     */
    class IOtimSdkCallback
    {
    public:
        virtual ~IOtimSdkCallback(){}
        
    
        virtual void netStatusChanged(int32_t status) = 0;
   
        virtual void loginResp(int32_t code, const std::string &clientId) = 0;
    
   
        virtual void kickOut() = 0;
   
        virtual void hotSessionResp(otim::HotSessionResp* hotSessions) = 0;
     
        virtual void msgRecv(int type, const std::string &packId, otim::MsgReq* req) = 0;
   
        virtual void msgAck(const std::string &packId, otim::MsgAck* ack) = 0;     
    };
       
    class IOtimSdk
    {
    public:
        virtual ~IOtimSdk(){}
        
        /**
         * 增加IM 服务器ip地址和端口
         * @param host ip地址
         * @param port 端口
         * @param isSSL 是否支持ssl连接
         */
        virtual void addHostInfo(const std::string&  host, int32_t port, bool isSSL) = 0;
        
        /**
         * 设置SDK 回调指针
         * @param callback 回调接口指针
         */
        virtual void setCallback(IOtimSdkCallback* callback) = 0;
        /**
         * 登录
         * @param name 用户名,可以不填写
         * @param password 密码,必须填写token
         */
        virtual int32_t login (const std::string&  name, const std::string&  password) = 0;
        /**
         * 登出
         * @param notifyServer 是否向server发送数据报文
         */
        virtual int32_t logout (bool notifyServer) = 0;
        /**
         * 发送消息
         * @param message 消息体
         */

        virtual int32_t sendMessage(int type, otim::MsgReq& req) = 0;

        /**
         * 获取网络状态
         */
        virtual int32_t getNetStatus() = 0;
        
        //获取当前clientId
        virtual std::string getClientId() = 0;
        
        /**
            * 请求用户信息
            * @param userIds 用户Id列表
            */
        virtual void reqUserinfosFromServer(std::vector<std::string> userIds) = 0;
        
     };
    
    
    /**
     * 日志记录接口
     */
    class IOtimLog{
    public:
        virtual ~IOtimLog(){}

        /**
         * 写日志
         * @param logs 日志内容
         */
        virtual void writeLog(const std::string& logs) = 0;
        
        /**
         * 获取日志文件名称及路径
         * @return 日志文件路径及名称 外部必须释放 返回字符串内存
         */
        virtual const std::string& getLogFileName() = 0;
        
    };
    
    /**
     * 初始化日志模块
     * @param appPath 日志保存路径
     */
    void initLog(const std::string& appPath);
    /**
     * 获取日志接口实例,调用此接口前必须调用 initLog
     */
    IOtimLog* getLogInstance();
    
    /**
     * 初始化IM 模块
     * @param clientInfo IM 所需要的参数
     */
    IOtimSdk* initIm(TNClientInfo &clientInfo);
    
  
    /**
     * 获取IMSDK IM模块实例
     * 调用此函数前必须调用 initIm接口
     */
    IOtimSdk* getImSDK();

源码说明

源码地址

https://github.com/lanhy/otim.git

目录说明

  • doc
    • 文档目录,目前有两个文档著作
    • 《基于Tars高并发IM系统的设计与实现》
    • 《OMTP协议说明文档》
  • client
    • 客户端SDK及示例代码
  • server
    • 服务端代码,基于Tars微服务架构的IM系统相关子服务;
  • test
    • 自动测试代码;

服务端源码结构

  • BrokerServer
    接入服务
  • HttpServer
    开放平台及接口服务
  • AuthServer
    认证服务
  • GroupChatServer
    群聊服务
  • PushServer
    离线push服务
  • BizMsgServer
    业务通知消息服务
  • HistoryMsgServer
    离线(历史)消息服务
  • SingleChatServer
    单聊服务
  • UserFriendServer
    用户好友服务开放平台及接口服务
  • MsgOperatorServer
    消息操作服务
  • OlapServer
    Mysql冷存储服务
  • third
    第三方库
  • Common
    公共模块
  • CommonTars
    OMTP协议Tars文件

客户端SDK源码结构

  • lib
    第三方库
  • source
    客户端SDK代码
  • source
    客户端SDK代码
  • OMTP
  • TestSDK
    SDK调用实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/858033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP最简单自定义自己的框架控制器自动加载运行(四)

1、实现效果调用控制中方法 2、创建控制器indexCrl.php <?php class indexCrl{public function index(){echo 当前index控制器index方法;} } 3、KJ.php字段加载控制器文件 public static function run(){//定义常量self::_set_const();//创建模块目录self::_mk_module();…

Windows下运行Tomcat服务时报GC Overhead Limit Exceeded

根本原因是在新建Tomcat作为Windows服务时&#xff0c;系统默认设置的堆内存太小了&#xff0c;我们打开/bin/service.bat文件&#xff0c;将如下图所示的默认值改大一些就好了 if "%JvmMs%" "" set JvmMs512 if "%JvmMx%" "" set J…

嵌入式AI芯片架构用处

Blaize将其GSP描述为能够执行“直接图处理&#xff0c;片上任务图管理和执行以及任务并行性”。简而言之&#xff0c;Blaize设计了GSP来满足AI&#xff0c;GPU&#xff0c;CPU或DSP以前无法满足的处理需求。 对于许多涉及嵌入式ai处理器的行业分析师而言&#xff0c;这是他们之…

算法通关村——轻松搞定最大深度问题

前言 二叉树的深度&#xff1a;从根节点到当前节点的最长简单路径边的条数 题目 给定一个二叉树&#xff0c;找出其最大深度&#xff0c;二叉树的深度为根节点到最远叶子节点的最长路径上的节点数 说明 如下图所示&#xff0c;对于node(3) &#xff0c; 最大深度自然是左右子节…

pmp考试是智商税吗,是一场持久的割韭菜战吗?

在一些大型企业中&#xff0c;PMP认证已成为担任“项目经理”必备的资格之一。此外&#xff0c;在国际上&#xff0c;PMP认证也成为参与项目招标的必要条件之一&#xff0c;只有拥有PMP认证的项目经理所在的公司才有资格参与竞标&#xff0c;而承建项目经理也必须持有PMP认证。…

RabbitMQ 安装教程

RabbitMQ 安装教程 特殊说明 因为RabbitMQ基于Erlang开发&#xff0c;所以安装时需要先安装Erlang RabbitMQ和Erlang版本对应关系 查看地址&#xff1a;www.rabbitmq.com/which-erlan… 环境选择 Erlang: 23.3及以上 RabbitMQ: 3.10.1Windows 安装 1. 安装Erlang 下载地…

海外进出口跨境电商独立站开发(多语言+多货币)

要搭建一个海外进出口跨境电商独立站开发&#xff0c;需要考虑以下几个方面&#xff08;以下步骤不分先后&#xff09;&#xff1a; 设计系统架构在开始编写代码之前&#xff0c;首先需要设计系统的整体架构。对于一个大型的电商系统&#xff0c;需要考虑系统可扩展性、高可用…

NameError: No such file or directory 解决方法

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 问题 最近有小伙伴经常问到这个报错&#xff0c;今天来分享一下具体怎么解决。 [Errno 2] No such file or directory: ./mnist_image_label/mnist_train_jpg_60000.txt这个没有查找到子文件或者子文件夹的问题 解决…

CPU与硬件的交互方式(中断、轮询)

CPU与硬件的交互方式 轮询方式&#xff1a;CPU不断的访问硬件有没有进行操作&#xff0c;如果接收到了信息&#xff0c;CPU就处理。如果没有过一会在访问一遍 直到有信息为止 中断方式&#xff1a;硬件操作的时候会写一个中断&#xff0c;向CPU发送这个中断&#xff0c;CPU正常…

【LeetCode】练习习题集【4月 - 7 月】

LEETCODE习题集【4月-7月总结】 简单 数组部分 1.重复数 题目&#xff1a; 在一个长度u为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中…

网络安全—黑客技术【自学】

一、黑客是什么 原是指热心于计算机技术&#xff0c;水平高超的电脑专家&#xff0c;尤其是程序设计人员。但后来&#xff0c;黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实&#xff0c;网络信息空间安全已经成为海陆空之…

Linux驱动——input子系统

一、input子系统基本框架 Linux内核为了两个目的&#xff1a; 简化纯输入类外设&#xff08;如&#xff1a;键盘、鼠标、游戏杆、轨迹球、触摸屏。。。等等&#xff09;的驱动开发 统一输入类外设产生的数据格式&#xff08;struct input_event&#xff09;&#xff0c;更加方…

将你的计算机变身为果园守护者:与本地树莓派建立连结的乐趣探索!!

如何连接本地树莓派 文章目录 如何连接本地树莓派前言1. 操作流程2. 打开树莓派SSH功能3. 确认树莓派信息后 安装相应SSH客户端 &#x1f341; 小结 &#x1f341; 前言 树莓派作为一款以教育为目的推出的硬件系统&#xff0c;也是超低功耗的微型“准系统”&#xff0c;能够提…

Redis的RDB持久化

Redis是一个键值对数据库服务器&#xff0c;服务器中通常包含着任意个非空数据库&#xff0c;而每个非空数据库中又可以包含任意个键值对&#xff0c;为了方便起见&#xff0c;我们将服务器中的非空数据库以及它们的键值对统称为数据库状态。 举个例子&#xff0c;下图展示了一…

模仿学习(行为克隆,逆强化学习,生成式对抗模仿学习)

目录 1.模仿学习 1.1先说强化学习 1.2再说逆强化学习 1.3最后说生成对抗模仿学习 1.3.1先说GAN 1.3.2再说生成对抗模仿学习 1.4逆强化学习常用方法 参考文献 1.模仿学习 定义&#xff1a;当我们想训练机器人时&#xff0c;通过复制人类的动作&#xff0c;对机器人进行训…

ssm新生报到系统源码和论文PPT

ssm新生报到系统源码和论文PPT004 开发环境 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 选题依据及意义 每学年九月份随着新生的入校&#xff0c;学校工作中的重点都会集…

Endnote中导入和显示中文文献国标格式具体实现步骤

Endnote中导入和显示中文文献国标格式具体实现步骤 目录 Endnote中导入和显示中文文献国标格式具体实现步骤一、下载中文文献引用标准格式二、将下载的两种格式复制到Endnote安装文件下的Styles子文件夹中三、对导入的样式进行标记&#xff0c;以便在word中方便显示和使用四、在…

领航优配:美联储货币政策风向或已生变 私行纵论下半年黄金配置价值

美联储钱银方针风向或已生变&#xff0c;黄金的拥趸开端跃跃欲试。 费城联储主席帕特里克哈克周二标明&#xff0c;美国有一条通往经济软着陆的路径&#xff0c;失业率或许有所上升&#xff0c;但起伏不会太大&#xff1b;不希望美联储过度收紧钱银方针&#xff0c;估计明年某时…

springBoot整合RabbitMq实现手动确认消息

如何保证消息的可靠性投递&#xff1f; 1.保证生产者向broke可靠性投递&#xff0c;开启ack投递成功确认&#xff0c;如果失败的话进行消息补偿 /*** author yueF_L* date 2023-08-10 01:32* ConfirmCallback&#xff1a;消息只要被 RabbitMQ broker 接收到就会触发confirm方…

OpenAI-Translator 实战总结

最近在极客时间学习《AI 大模型应用开发实战营》&#xff0c;自己一边跟着学一边开发了一个进阶版本的 OpenAI-Translator&#xff0c;在这里简单记录下开发过程和心得体会&#xff0c;供有兴趣的同学参考 功能概览 通过openai的chat API&#xff0c;实现一个pdf翻译器实现一个…