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

在这里插入图片描述

西邮Linux兴趣小组 大一暑期项目

开发设计文档

项目作者项目名称
李兆龙聊天室

1.项目引言

1.1项目综述
聊天室项目目的在于实现一个类似qq的通讯软件,支持好友模块,群模块,单聊,群聊,收发文件等,所有功能均支持在线离线,且有较好的用户体验。

1.2术语表

序号术语或缩略语说明性定义
1数据库此项目使用MySQL
2io多路复用项目中使用epoll
3Tcp/ip协议网络传输协议,此项目使用的就是这中传输协议
4C/S客户端服务器模型
5API函数接口
6线程池线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务
7Wireshark抓包工具

线程池我最后并没有用

1.3参考资料

参考资料
Linux编程实战
csdn
博客园
深入理解计算机系统
吕海东学长细心的讲解

1.4 项目开发环境、流程图绘制工具
开发环境:Deepin桌面版15.7.1,gcc编译器,vscode,vimplus,MySQL。

程序运行环境:
1.局域网

2.数据结构说明

链表,邻接表,map,分页器

3.模块设计

3.1程序函数调用图及模块化分
服务器端

  1. 第一层处理各种请求 处理连接请求,事件请求进入下一层
  2. 第二层处理不同的事件请求

客户端

  1. 第一层 登录界面
  2. 第二层 大体功能选择界面
  3. 第三层 具体功能选择界面

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.已知存在的问题及改善方案

  1. 虽然功能实现 单服务器的效率与健壮性却并不高 还需要大二对于网络编程的更加深入的学习才可以
  2. 进阶功能并没有实现很多 诸如视频聊天,断点续传,也从侧面反应出后期对于项目确实没有尽心尽力,对于以上功能会继续学习,早些加上
  3. 排错处理并没有到优秀的地步 一些地方没有进行排错
  4. 项目没有采用分层架构 可维护性较差
  5. 其中数据结构的选择并不是最优 很多可以优化的地方都使用了朴素算法
posted @ 2022-07-02 13:18  李兆龙的博客  阅读(88)  评论(0编辑  收藏  举报