聊天室(2)-项目开发文档-李兆龙

西邮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.已知存在的问题及改善方案
- 虽然功能实现 单服务器的效率与健壮性却并不高 还需要大二对于网络编程的更加深入的学习才可以
 - 进阶功能并没有实现很多 诸如视频聊天,断点续传,也从侧面反应出后期对于项目确实没有尽心尽力,对于以上功能会继续学习,早些加上
 - 排错处理并没有到优秀的地步 一些地方没有进行排错
 - 项目没有采用分层架构 可维护性较差
 - 其中数据结构的选择并不是最优 很多可以优化的地方都使用了朴素算法
 
                    
                
                
            
        
浙公网安备 33010602011771号