简介:
仿照QQ,实现简单的即时通讯软件,包含功能:注册/登录、昵称、群聊/私聊。
基于 C/S 模型
- Client使用 QT 实现
- Server采用Linux下 Epoll反应堆 + 线程池 实现
使用
//使用端口
12345
//编译
make
//运行
./server
特点:
- 较之其他版本,不仅实现基本收发功能,还实现了图形化界面及 在线列表/昵称 功能
- 双端采用统一的通信格式,对收发消息进行 指定长度 的读取,避免 Tcp粘包 问题
- Client 使用一个连接,以统一的 消息收发管理机制,根据消息的分类通过 信号与槽 分发至不同的模块
- Server 使用 多路I/O复用,避免 连接-进程/线程的一比一 创建,消耗系统资源
- Server 使用 线程池,避免线程 创建/销毁 的冗余操作
- Server 不定期对Client连接进行检查,关闭不活跃的连接,减轻Server压力
- Server 使用 sqlite 进行用户信息的存储
流程:
- Client:
注册-->连接-->验证注册-->等待结果-->提示结果-->断开连接-->跳转至登录
登录-->连接-->等待结果-->成功-->加载在线列表-->聊天
|
-->失败-->提示结果-->断开连接
- Server:
启动线程池/任务队列-->初始化在线列表-->初始化epoll-->初始化监听-->添加监听至epoll-
-->等待事件-->添加accpet任务-->添加epoll监听(等待接收)
|
|--->添加recv任务-->注册-->验证-->回复结果-->取消监听/关闭连接
| |
| |--->登录-->验证-->回复结果-->验证成功-->添加至在线列表
| | |
| | -->验证失败-->取消监听/关闭连接
| |
| |--->修改个人信息-->修改-->回复结果
| |
| --->转发消息-->查找-->转发
|
--->添加send任务-->发送消息
食用指南:
- 了解 Linux多线程 及 线程间通信
- 了解 Linux网络编程
- 了解 线程池 基本原理
- 了解 epoll反应堆模型 基本原理
- 了解 数据库基本原理 及 常用SQL语句
- 了解 Sqlite 的C语言编程接口
- 了解 常用 QT控件 使用
- 了解 常用 Makefile 编写
优化
- 完善 错误处理 及 非法数据处理
- 优化 Server 的 消息转发,如减少字符串拷贝的使用
- 优化 Client 的 UI设计
- 优化 在线列表 的数据结构,使用 排序二叉树 提升在线成员查询速率,考虑排序二叉树的退化,可采用更复杂的红黑树实现
- 优化 epoll 关联的 泛型参数 的数据结构
- 优化程序设计,从上到下设计,主干扩展分支
bug:
- Client消息接收 依次延迟 一条消息:
在 ubuntu16.04 / QT5.5.1环境下,同时打开多个客户端,,原因暂未发现(随机发生) - 中文 乱码 问题:
由于双端对数据的收发为进行 网络字节序 处理,直接粗暴的使用 结构体/数组 解析 数据,因此仅支持英文字符 - Server 先关闭,会导致下次监听失败:
在 Server 先关闭时,虽然 Client 有关闭连接代码,但重启 Server 后依旧监听出错,需要多次关闭 Client 或 等待,原因待继续深入研究 Socket
状态:
- 未完,待续...