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

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的