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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

2. 下载rknn-toolkit2项目

官网链接: https://github.com/airockchip/rknn-toolkit2 安装好git:[[1. Git的安装]] 下载项目: git clone https://github.com/airockchip/rknn-toolkit2.git 或者直接去github下载压缩文件,解压即可。

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果