基于TCP的聊天系统
Posted sy2453
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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.编译链接
- 1.初始化mysql操作句柄
-
用户管理模块
- 主要负责用户管理和维护,以及与工作线程和数据库模块之间的协作
- 用户管理模块底层用的是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.初始化部分
-
客户端
- 1.客户端注册,登录消息流转图
- 2.客服端添加好友流转图
- 3客户端聊天消息流转图(单边:客户端A向客户端B发送消息)
- 1.客户端注册,登录消息流转图
以上是关于基于TCP的聊天系统的主要内容,如果未能解决你的问题,请参考以下文章