基于TCP的聊天系统

2年前 (2022) 程序员胖胖胖虎阿
254 0 0

目录

服务端

数据库模块

用户管理模块

自定义消息类型

消息队列

服务端核心部分

客户端


服务端

  • 基于TCP的聊天系统

  • 数据库模块

    • 数据库模块主要是对数据库的操作,数据的增添,数据的查询
    • 要使用C语言连接mysql,需要使用mysql官网提供的库
    • 下面是必要的基本操作:
      • 1.初始化mysql操作句柄
        • 函数原型:MYSQL *mysql_init(NYSQL *mysql);
        • 函数含义︰分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则将初始化对象,并返回对象的地址。
        • 调用示例:MYSQL* mysql_ = mysql_init(NULL);
      • 2.连接mysql服务端、
        • 基于TCP的聊天系统

        • 函数含义∶连接mysql服务端,如果连接成功,在返回的是MYSQL操作句柄,失败返回NULL
        • 调用示例: mysql_real_connect(&mysql,"host";"user","passward","database",0,NULL,0)
        • 设置连接对应的字符集
          • 基于TCP的聊天系统

          • 函数含义:用于设置当前连接的默认字符集
      • 3.执行sql语句
        • 基于TCP的聊天系统

      • 4.获取结果集
        • 基于TCP的聊天系统

         

      • 5.获取结果集行数
        • 基于TCP的聊天系统

      • 6.获取结果集的下一行
        • 基于TCP的聊天系统

      • 7.释放结果集内存
        • 基于TCP的聊天系统

      • 8.释放操作句柄
        • void mysql_close(MYSQL* mysql);
      • 9.编译链接
        • 基于TCP的聊天系统

  • 用户管理模块

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

    • 工作线程为了能够区分各种消息,消息主要包含两大类:客户端发送的请求和服务端作出的应答,需要设定消息的类型
      • 当前聊天系统的消息类型和应答状态:
        • 基于TCP的聊天系统

        • 基于TCP的聊天系统

    • Json Value对象
      • Json是一种K-V形式的数据格式,支持嵌套定义,支持数组
      • 可以按照自己的业务场景组织
      • 基于TCP的聊天系统

      • json数据类型:对象,数组,字符串,数字
      • 对象:使用花括号括起来的表示一个对象。
      • 数组:使用中括号[ ]括起来的表示一个数组。
      • 字符串:使用常规双引号""括起来的表示一个字符串
      • 数字:包括整形和浮点型,直接使用。
    • 消息格式:
      • 注册请求和应答
        • 基于TCP的聊天系统

      • 登录请求和应答
        • 基于TCP的聊天系统

      • 添加好友请求及应答(服务端与添加方)
        • 基于TCP的聊天系统

      • 推送添加好友请求及应答(服务端与被添加方)
        • 基于TCP的聊天系统

      • 发送消息及应答
        • 基于TCP的聊天系统

      • 推送消息及应答
        • 基于TCP的聊天系统

      • 获取全部好友信息及应答
        • 基于TCP的聊天系统

    • 序列化与反序列化
      • 定长的数据结构:成员变量在内存是连续的
      • Json对象保存的KV结构的内存是不连续的
      • 在发送接收数据时,调用的send和recv,其发送和接收的数据是连续的,因此在发送数据之前,需将Json对象序列化为二进制,而在接受完数据之后,需要将二进制反序列化为Json对象
      • 基于TCP的聊天系统

      • 基于TCP的聊天系统

  • 消息队列

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

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

  • 客户端

    • 1.客户端注册,登录消息流转图
      • 基于TCP的聊天系统

    • 2.客服端添加好友流转图
      • 基于TCP的聊天系统

    • 3客户端聊天消息流转图(单边:客户端A向客户端B发送消息)
      • 基于TCP的聊天系统

版权声明:程序员胖胖胖虎阿 发表于 2022年10月1日 上午4:00。
转载请注明:基于TCP的聊天系统 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...