My_chatting_room 项目文档

My_chatting_room 项目文档

这个项目写的并不好….自己写项目的时候状态也很糟糕…会在后续部分继续完善这些内容

目录

  • 引言
    • 项目综述
    • 术语表
    • 参考资料
    • 开发环境及使用工具
    • 使用说明
  • 数据结构说明
  • 模块设计
    • 程序函数调用图及模块分化
    • 功能设计说明
  • 文件说明
  • 异常,错误处理
  • 已经存在的问题及改善方案

引言

项目综述


随着现代通信的发展,很多聊天工具都开始流行,在此趋势之上开始写的基于Linux平台下的聊天工具,目前已经实现了部分的通信功能,会在后续继续完善实现.

实现的功能有:


所有的菜单都是以自己封装的getch函数来实行方向键,在一定程度上提高了界面的友好性,emmmmmmm虽然也造成了很多的问题,看起来似乎是值得的.


1.好友管理:

  • 添加好友
  • 删除好友
  • 添加黑名单
  • 查看好友列表
  • 显示好友状态

2.账号管理:

  • 登陆(防止重复登陆)
  • 注册 (防止重复注册)
  • 密码(md5加密)
  • 找回密码

3.聊天通信:

  • 私聊
  • 群聊
  • 查看聊天记录
  • 屏蔽某人消息
  • 离线消息

4.群管理:

  • 创建群
  • 加群
  • 退群
  • 查看已经加入的群,查看群成员
  • 解散群
  • 踢人

5.传送文件

  • 发送文件和接受文件(大文件)

6.服务器

  • 稳定性
  • 容错处理
  • 服务器日志

7.数据库的使用

  • Mysql数据库的使用

8.I/O多路复用

  • epoll单线程

术语表


序号 术语 说明性定义
1 C/S Client/Server模型
2 epoll Linux下处理大批量的文件描述符的API
3 makefile Linux下进行工程构建的文件
4 mysql 用于存储大量数据的工具

参考资料


在进行该项目的实现时,也查阅了很多的资料

a.相关类型的书籍

书籍 作者
< Linux_C编程实战 > 董永清
< 鸟哥的Linux私房菜(第三版) VBird
CSDN博文

b.查阅的相关的博客,网上资料

资料名 作者
(笔记)Linux下网络编程,采用TCP协议实现的C/S架构 fly_chen
IO复用之——epoll 敲完代码好睡觉zzz
socket通信简介 小伟哥

开发环境及使用工具

开发环境: Fedora 4.17.3-100.fc27.x86_64

开发工具: Vim及VSCode,gcc编译器

绘图工具: ProcessOn

局域网/外网

需要把自己的数据库和数据库密码进行修改

在这里客户端连接的ip地址应该为

执行ifconfig 然后得到的ip地址,因为处于不同的网络,ip地址可能是不相同

需要安装mysql 数据库

在fedora27上的安装方法为 :

添加源 : dnf install https://dev.mysql.com/get/mysql57-community-release-fc27-10.noarch.rpm

3b.更新或安装MySQL8.0.4

dnf --enablerepo=mysql80-community install mysql-community-server


4.开启MySQL服务并且启动时自动启动MySQL

    systemctl start mysqld.service ## 更新后重新启动服务

    systemctl enable mysqld.service


5.获取您生成的随机root密码

grep 'A temporary password is generated for root@localhost' /var/log/mysqld.log |tail -1

输出例子:

2015-11-20T21:11:44.229891Z 1 [Note] A temporary password is generated for root@localhost: -et)QoL4MLid

你的root随机密码就是:-et)QoL4MLid
6.登录MySQL并且修改root密码

mysql -u root -p

使用刚才的随机密码登录

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
把密码进行修改

在使用的时候需要
#include < mysql/mysql.h>
所以需要安装依赖包才行
sudo dnf instal libmysqlclient-dev

数据库中的表可以参考我的github上所建立的表里面有mysql.sql,当然也可以自己建立

数据结构说明

本项目中主要是进行线程,进程,网络编程知识,mysql的综合运用

所涉及到的数据结构并不是很多,主要是以下:

数据结构 使用
链表 链表主要是在Server端使用,我在这里使用了链表存储了当前所连接到服务器中的所有用户,也在client端进行了使用,主要用于存储了消息盒子

模块设计

本程序主要是以包传递的方式来进行编写的,传递结构体,自己封装了getch函数,让菜单以方向键的形式,自己封装了recv函数和send函数,防止意外情况并没有读取完毕

程序函数调用图及模块分化


Client(客户端)

My_chatting_room 项目文档_第1张图片

Server(服务端)

My_chatting_room 项目文档_第2张图片

功能设计说明


Client–main模块


功能描述

此模块是进行Client总体控制的main模块

算法和流程图

My_chatting_room 项目文档_第3张图片

Client–recv模块


功能描述

此模块是Client进行接收包的recv模块,负责消息的接受。

算法和流程图

My_chatting_room 项目文档_第4张图片

Client–chat_data模块


功能描述

此模块是进行Client聊天室的主体控制程序模块

算法与流程图

My_chatting_room 项目文档_第5张图片

client_friend_chat模块


功能描述

此模块是表示My_chatting聊天室的好友聊天的板块

算法与流程图

My_chatting_room 项目文档_第6张图片


client_group_chat模块


功能描述

此模块是表示群组聊天的板块

算法与流程图

My_chatting_room 项目文档_第7张图片


Server–main模块


功能描述

此模块是Server总体控制的main模块

算法与流程图

My_chatting_room 项目文档_第8张图片

epoll模块


功能描述

此模块是Server进行事件管理的重要的epoll模块

算法与流程图

server_intput模块


功能描述

此模块是Server进行事件处理的模块

算法与流程图

My_chatting_room 项目文档_第9张图片

文件说明(数据库)

文件名 文件描述
system_log 存储服务器的日志,发生的状态
chat_record 存储消息记录
friends_number 存储好友列表和状态
group_name_number 表示谁建立的哪个群
off_line_record_number 表示谁的离线消息和记录
group_number number所加入的群列表
users 表示服务器中的所有用户

异常,错误处理

1.关于自己写的方向键,造成的缓冲区问题

解决方案:对缓冲区进行及时的操作

使用getchar()或者其他的清除缓冲区的方式

int getch1() //已经封装好的getch函数
{
    int c = 0;
    int res = -1;
    struct termios org_opts, new_opts;

    res = tcgetattr(STDIN_FILENO, &org_opts);//设置终端的属性
    assert(res == 0);
    memcpy(&new_opts, &org_opts, sizeof(org_opts));
    new_opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHOK | ECHONL | ECHOPRT | ECHOKE);
    tcsetattr(STDIN_FILENO, TCSANOW, &new_opts);
    c = getchar();
    res = tcsetattr(STDIN_FILENO, TCSANOW, &org_opts);
    assert(res == 0);

    return c;
}

2.在其他方面因为数据库中表的规划的失误,导致操作不合逻辑,比如好友状态的改变,需要每次从数据库中读取,在有的地方没有进行错误提示消息

解决方法:将好友状态等改为用链表存储,方便管理

3.服务端,epoll多线程造成的发文件死锁问题

解决方法:epoll多线程的架构问题,应该是先接收,根据接收的标志位来进行处理并且创建线程,在多次发送文件的时候,应该实行文件同步问题,可以采用pthread_join ()或者加锁或者pthread_detach(),来进行线程的同步

4.发送文件的时候会创建很多线程,如果内存不够大的时候会有一些影响甚至发生死锁问题

解决方法:在shell终端上使用ulimit -a 来查看线程 栈的大小,可以根据自己的值来改变 使用ulimit -s 来进行改变,这样的话会可以创建更多的线程

已经存在的问题及改善方案

问题1:不合理的结构

解决方案:结构体的成员应该分离,不应该添加的过多,epoll的多线程的结构应该进行改变,还有好友的状态应该由链表来进行维护

问题2:对于不合理的输入

解决方案:仍然需要继续进行非法输入的处理,对ctrl+c进行处理

你可能感兴趣的:(fedora,linux,线程)