• 基于TCP的聊天系统


    目录

    服务端

    数据库模块

    用户管理模块

    自定义消息类型

    消息队列

    服务端核心部分

    客户端


    服务端

    • 数据库模块

      • 数据库模块主要是对数据库的操作,数据的增添,数据的查询
      • 要使用C语言连接mysql,需要使用mysql官网提供的库
      • 下面是必要的基本操作:
        • 1.初始化mysql操作句柄
          • 函数原型:MYSQL *mysql_init(NYSQL *mysql);
          • 函数含义︰分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则将初始化对象,并返回对象的地址。
          • 调用示例:MYSQL* mysql_ = mysql_init(NULL);
        • 2.连接mysql服务端、
          • 函数含义∶连接mysql服务端,如果连接成功,在返回的是MYSQL操作句柄,失败返回NULL
          • 调用示例: mysql_real_connect(&mysql,"host";"user","passward","database",0,NULL,0)
          • 设置连接对应的字符集
            • 函数含义:用于设置当前连接的默认字符集
        • 3.执行sql语句
        • 4.获取结果集

           

        • 5.获取结果集行数
        • 6.获取结果集的下一行
        • 7.释放结果集内存
        • 8.释放操作句柄
          • void mysql_close(MYSQL* mysql);
        • 9.编译链接
    • 用户管理模块

      • 主要负责用户管理和维护,以及与工作线程和数据库模块之间的协作
      • 用户管理模块底层用的是unordered_map,维护所有的用户信息,由于多个工作线程可能同时对其进行操作,因此需要加锁保护
      • 用户管理模块内部实现的接口:
        • 1.初始化:连接数据库,查询所有用户信息,维护信息
        • 2.用户注册。
        • 3.用户登录。
        • 4.检测用户是否在线。
        • 5.获取用户信息。
        • 6.获取好友信息。
        • 7.建立好友关系。
    • 自定义消息类型

      • 工作线程为了能够区分各种消息,消息主要包含两大类:客户端发送的请求和服务端作出的应答,需要设定消息的类型
        • 当前聊天系统的消息类型和应答状态:
      • Json Value对象
        • Json是一种K-V形式的数据格式,支持嵌套定义,支持数组
        • 可以按照自己的业务场景组织
        • json数据类型:对象,数组,字符串,数字
        • 对象:使用花括号括起来的表示一个对象。
        • 数组:使用中括号[ ]括起来的表示一个数组。
        • 字符串:使用常规双引号""括起来的表示一个字符串
        • 数字:包括整形和浮点型,直接使用。
      • 消息格式:
        • 注册请求和应答
        • 登录请求和应答
        • 添加好友请求及应答(服务端与添加方)
        • 推送添加好友请求及应答(服务端与被添加方)
        • 发送消息及应答
        • 推送消息及应答
        • 获取全部好友信息及应答
      • 序列化与反序列化
        • 定长的数据结构:成员变量在内存是连续的
        • Json对象保存的KV结构的内存是不连续的
        • 在发送接收数据时,调用的send和recv,其发送和接收的数据是连续的,因此在发送数据之前,需将Json对象序列化为二进制,而在接受完数据之后,需要将二进制反序列化为Json对象
    • 消息队列

      • 使用STL库中的queue,加上互斥锁和条件变量,保证互斥和同步,插入队列的元素类型的泛型的
    • 服务端核心部分

      • 1.初始化部分
        • 创建侦听套接字、绑定、监听
        • 创建epoll操作句柄
        • 创建用户管理类对象,获取实例化指针
        • 创建接收队列和发送队列
      • 2.启动各类线程部分
        • 创建epoll的监控线程
        • 创建发送线程
        • 创建工作线程
        • 主线程循环接收新连接并将新连接套接字文件描述符放到eopll中进行监控
      • 工作线程:
        • 处理来自客户端的各种请求
    • 客户端

      • 1.客户端注册,登录消息流转图
      • 2.客服端添加好友流转图
      • 3客户端聊天消息流转图(单边:客户端A向客户端B发送消息)
  • 相关阅读:
    【QEMU系统分析之启动篇(十七)】
    springboot vue elementui理发店预约系统源码
    C++ 中的 this 指针
    Linux Android 平台中的蓝牙功能学习总结
    ECMAScript6 学习笔记
    UE4 TCP协议连接服务器与客户端
    Java Character.isTitleCase()具有什么功能呢?
    Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
    Linux 中的内部命令和外部命令
    如何搭建双 M 结构的主从备份?
  • 原文地址:https://blog.csdn.net/sy2453/article/details/126186416