西邮Linux兴趣小组 大一暑期项目
开发设计文档
项目作者 | 项目名称 |
---|---|
李兆龙 | 聊天室 |
1.项目引言
1.1项目综述
聊天室项目目的在于实现一个类似qq的通讯软件,支持好友模块,群模块,单聊,群聊,收发文件等,所有功能均支持在线离线,且有较好的用户体验。
1.2术语表
序号 | 术语或缩略语 | 说明性定义 |
---|---|---|
1 | 数据库 | 此项目使用MySQL |
2 | io多路复用 | 项目中使用epoll |
3 | Tcp/ip协议 | 网络传输协议,此项目使用的就是这中传输协议 |
4 | C/S | 客户端服务器模型 |
5 | API | 函数接口 |
6 | 线程池 | 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务 |
7 | Wireshark | 抓包工具 |
线程池我最后并没有用
1.3参考资料
参考资料 | |
---|---|
Linux编程实战 | |
csdn | |
博客园 | |
深入理解计算机系统 | |
吕海东学长细心的讲解 |
1.4 项目开发环境、流程图绘制工具
开发环境:Deepin桌面版15.7.1,gcc编译器,vscode,vimplus,MySQL。
程序运行环境:
1.局域网
2.数据结构说明
链表,邻接表,map,分页器
3.模块设计
3.1程序函数调用图及模块化分
服务器端
- 第一层处理各种请求 处理连接请求,事件请求进入下一层
- 第二层处理不同的事件请求
客户端
- 第一层 登录界面
- 第二层 大体功能选择界面
- 第三层 具体功能选择界面
3.2功能设计说明
UI_Client_Login()
UI_Client_Fun()
登录成功后显示
UI_Client_Friend_List()
UI_Client_Friend_Chat()
双机实时聊天
UI_Client_Group_List()
UI_Client_Group_Chat()
多机实时聊天
3.3函数说明
客户端函数头文件
int my_recv(int conn_fd,char *data_buf,int len);
int my_recv_tmp(int conn_fd,char *data_buf,int len);
int get_userinfo(char *buf,int len);
int input_userinfo(recv_t *temp);
int FetchAll_for_Friend_List();
int login_client(int conn_fd,char *username);
int register_client(int conn_fd,char *account);
int Retrieve_client(int conn_fd);
int Add_Friend(int conn_fd);
int Del_Friend(int conn_fd);
int send_friend_messages(char *account,char *Message);
int Chat(char *account);
int show_friend_list();
int register_group_client(int conn_fd);
int Add_group(int conn_fd);
int Quit_group(int conn_fd);
int Dissolve(int conn_fd);
int Set_Admin(int conn_fd,char * count);
int Kicking(int conn_fd,char *count);
int recv_file(recv_t *package);
void *method_client(void *arg);
int show_group_member(char *account);
int send_group_messages(char *account,char *Message);
int Group_Chat(char *account);
int show_group_list();
void *send_file(void *arg);
服务器函数
int login(recv_buf,&mysql);
int register_server(recv_buf,&mysql);
int Retrieve_server(recv_buf,&mysql);
int add_friend_server(recv_buf,&mysql);
int add_friend_server_already_agree(recv_buf,&mysql);
int del_friend_server(recv_buf,&mysql);
int List_friends_server(recv_buf,&mysql);
int send_messages_server(recv_buf,&mysql);
int register_group_server(recv_buf,&mysql);
int Add_group_server(recv_buf,&mysql);
int Quit_group_server(recv_buf,&mysql);
int Dissolve_server(recv_buf,&mysql);
int Set_Admin_server(recv_buf,&mysql);
int Kicking_server(recv_buf,&mysql);
int Send_group_messages_server(recv_buf,&mysql);
int Send_file_server(recv_buf);
int *solve(void *arg);
3.4其他说明
一个是数据库的建表问题,另一个是线程池的引入。
建表问题
个人认为大一假期的这个项目就是简单的了解数据库,有很多的特性其实要学习也要一段时间,所以不必追求在这个方面做的非常好,当然要是以前学过的话当然要全力以赴,再来说说建表,我一共是建了八张表,其实应该是七张,因为当时并不熟悉主键这个东西,所以强行用一张表模拟了主键,
线程池问题
因为假期时间较为紧张,所以我到最后并没有加上线程池,但epoll+线程池却是个很好的模型,可以把线程池用在这两个地方,一个是服务器用多线程写,来一个请求使用一个线程处理,完成后加入线程池,以此类推。
二是客户端接收文件可以用线程池,但其实用处不是那么大,相比与一个客户端发文件的资源,线程创建的开销到是可以忽略不计了,所以不建议
4.文件说明
文件名 | 功能描述 |
---|---|
server.c | 存放服务器主函数 |
solve.c | 存放服务器各种请求的处理函数 |
client.c | 存放客户端主函数 |
incident.c | 存放客户端各种请求的处理函数 |
5.异常错误处理
首先标明了用户有权限的操作,然后对用户的一般性操作进行排错处理,保证健壮性,
6.已知存在的问题及改善方案
- 虽然功能实现 单服务器的效率与健壮性却并不高 还需要大二对于网络编程的更加深入的学习才可以
- 进阶功能并没有实现很多 诸如视频聊天,断点续传,也从侧面反应出后期对于项目确实没有尽心尽力,对于以上功能会继续学习,早些加上
- 排错处理并没有到优秀的地步 一些地方没有进行排错
- 项目没有采用分层架构 可维护性较差
- 其中数据结构的选择并不是最优 很多可以优化的地方都使用了朴素算法