一.项目功能
1.账号管理
登录、注册
找回密码
2.好友管理
私聊(实时性)
好友的添加、删除、查询
查看好友列表
显示好友状态(在线与否)
查看聊天记录
屏蔽好友消息
3.群管理
群聊(实时性)
群的创建、解散(群主才有的权限)
申请加群、退群
查看已加群、查看群成员
查看聊天记录
设置群管理员
踢人(群主或管理员才有的权限)
4.发送文件
文件传输
5.关于客户端与服务器要求
稳定性
要能处理大量客户端的连接与信息处理、传输
服务器稳定,不会因客户端的意外情况退出
数据正常接受、处理、发送
有容错处理,避免因非法输入导致C/S崩溃
高效性
服务器日志,记录服务器的状态信息
7.相关技术要求
I/O 多路复用(epoll)
mysql
二.开发环境及工具:
Ubuntu 20.04.2 LTS x86-64
vscode
gcc 9.3.0
三.基础架构
1.server
服务器端采用epoll+多线程模式达到处理大量客户端的连接与信息处理、传输,每当客户端发来一个请求时开一个线程进行处理,处理完之后对线程进行销毁。
但当大量客户端同时向服务器发送请求时,线程创建、销毁、切换的开销较大,服务器效率会下降很多。
2.client
客户端首先创建一个用来接收服务器数据的线程并加到数据队列中,主线程主要是主体逻辑的实现。
3.数据存储
主要用到mysql
表名 | 存放 |
---|---|
login_info | 个人信息 |
friends | 好友关系 |
friend_msg | 私聊消息 |
group_info | 群聊信息 |
group_management | 群聊关系管理 |
group_msg | 群聊消息 |
四.一些实现思路
私聊、群聊、文件传输的实现都是由客户端发到服务器,再由服务器发送到目标客户端。
1.客户端接收数据
前面说到了客户端会有一个专门用来接收数据的线程以及一个数据队列,客户端向服务器发送请求后,会阻塞等待来自服务器的一些数据和反馈,当接收线程接收到数据后会唤醒主线程并加锁存到数据队列中,而主线程会阻塞判断数据队列中是否有数据,如果有数据则加锁读出数据队列中的数据进行之后的操作。
2.文件传输
由于服务器的epoll架构会在同一个地方接收客户端的所有请求和数据,但我想保证在文件传输过程中数据的连续以及传输效率,所以会把该客户端的socketfd从epoll中摘下来,单独接收文件数据,接收完成后再加到epoll中进行后面操作的处理。
五.项目展示