My_chatting_room 项目文档

2024-03-26 23:59
文章标签 文档 项目 room chatting

本文主要是介绍My_chatting_room 项目文档,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

My_chatting_room 项目文档

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

目录

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

引言

项目综述


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

实现的功能有:


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


1.好友管理:

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

2.账号管理:

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

3.聊天通信:

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

4.群管理:

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

5.传送文件

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

6.服务器

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

7.数据库的使用

  • Mysql数据库的使用

8.I/O多路复用

  • epoll单线程

术语表


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

参考资料


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

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.rpm3b.更新或安装MySQL8.0.4dnf --enablerepo=mysql80-community install mysql-community-server4.开启MySQL服务并且启动时自动启动MySQLsystemctl start mysqld.service ## 更新后重新启动服务systemctl enable mysqld.service5.获取您生成的随机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(客户端)

这里写图片描述

Server(服务端)

这里写图片描述

功能设计说明


Client–main模块

功能描述

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

算法和流程图

这里写图片描述

Client–recv模块

功能描述

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

算法和流程图

这里写图片描述

Client–chat_data模块

功能描述

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

算法与流程图

这里写图片描述

client_friend_chat模块

功能描述

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

算法与流程图

这里写图片描述


client_group_chat模块

功能描述

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

算法与流程图

这里写图片描述


Server–main模块

功能描述

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

算法与流程图

这里写图片描述

epoll模块

功能描述

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

算法与流程图

server_intput模块


功能描述

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

算法与流程图

这里写图片描述

文件说明(数据库)

文件名文件描述
system_log存储服务器的日志,发生的状态
chat_record存储消息记录
friends_number存储好友列表和状态
group_name_number表示谁建立的哪个群
off_line_record_number表示谁的离线消息和记录
group_numbernumber所加入的群列表
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进行处理

这篇关于My_chatting_room 项目文档的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850292

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机