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

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word