# 多功能聊天室 **Repository Path**: dys168/multi-functional-chat-room ## Basic Information - **Project Name**: 多功能聊天室 - **Description**: 一个基于Linux网络编程的项目,能够实现基本的单聊、群聊、文件上传功能 - **Primary Language**: C - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-09-04 - **Last Updated**: 2025-01-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 项目介绍 EchoLinxChatter是一款基于Linux环境开发的聊天软件,综合运用epoll、多线程、多进程、互斥锁、数据库、socket编程、TCP/UDP等技术栈,实现对用户的管理、用户之间的公网双向聊天、用户之间的文件传输、用户对好用的添加和删除以及用户加入群聊和退出群聊等功能。 ![](https://cdn.nlark.com/yuque/0/2024/png/35601396/1728386553395-b19c04ec-de1f-4f03-8426-7f112de5c507.png) ## 项目开发环境 1. 服务器 开发环境:Ubuntu16.04 开发语言:C/C++ 测试环境:Ubuntu22.04 通信协议:TCP/UDP 数据库:MySQL/SQLite 加密方式:自定义加密 开发工具:VScode、gdb、gcc、git 2. 客户端 开发环境:Ubuntu16.04/windows11 开发语言:C/C++ 测试环境:Ubuntu16.04/windows11 通信协议:TCP/UDP 加密方式:自定义加密 开发工具:QT、VScode、gdb、gcc、git 3. 涉及技术栈 多进程、多线程、epoll、线程池、socket网络编程、TCP/UDP传输协议, 互斥锁、QT框架、gui、core、network、multimediawidgets等模块。 ## 项目功能介绍 1. 注册登录模块:用户可以输入手机号、密码进行账号注册,注册成功后会返回给用户一个账号和用户设置的密码。服务器收到用户注册的手机号后对用户的其他属性设置为默认值,从而保存到MySQL数据库中。用户登录后服务器查找数据库信息进行核对并发送用户基本信息和好用列表。 2. 好友管理模块:用户可以根据好友账号ID搜索好友,从而添加进自己的好友列表,服务器完成对用户好友列表数据的更新。删除好友则可以想服务器发送删除好友请求,从而服务器对操作数据库数据进行更新,并返回删除结果。 3. 好友聊天模块:用户选择好友进行聊天,好友如果在线服务器将会转发消息,如果好友不在线则会告诉用户该好友目前离线,不能接受信息。好友在线时不仅可以发送信息,还支持文件在线传输。 4. 群聊模块:用户可以加入公共群聊频道,在里面进行消息的发送和文件的上传下载。 5. 数据库模块:刚开始使用文件进行数据保存和读取,逐渐迭代到SQLite数据,最后采用MySQL数据进行用户管理。MySQL数据库管理数据更为安全可靠,在使用数据库时需要进行密码验证,提升了数据库的安全性。 6. 日志模块:在项目开发时设置了日志管理,采用文件保存每次操作的过程和完成程度,通过日志文件可以很快的排查到问题所在能够提升开发效率和减小开发难度。 ## 项目开发过程所遇问题 1. 问题一 问题描述:QT写客户端,把接收信号绑定两个界面的槽函数 只有mainwindow绑定的槽函数读取了数据 ,另一个没有获取数据 而且mainwindow 在第一次获取数据时有多余数据 问题解决:将第一个槽函数解除连接 2. 问题二 问题描述:客户端给自己账号发送消息 服务器能够转发 且客户端收到信息 但未能正确解析json数据 且收到的json数据多了很多其他未知数据。 问题解决:让服务器将收到的数据进行解析重新封装json格式再进行抓发 问题产生原因:由于服务器是转发数据 即对收到json数据包判断其类型是需要转发 即直接转发 不在进行解析 然而此时转发出去的数据是带有脏数据的,导致接收数据的客户端没有成功收到数据。 3. 问题三 问题描述:mysql语句正常执行 但数据库表中并没有数据 问题解决:通过Ubuntu中MySQL命令能够查询到新的数据,但在VScode通过查询则没有显示新数据。 ## 总结与收获 项目在前期设计通信协议时考虑不够完善,在逐渐开发中进通信协议在逐步叠加数据,导致数据存在冗余,其次在多线程处理用户请求时没有处理好参数传递。客户端在设计时没有做接收数据与用户界面的分离。但是通过这次项目开发,我收获颇多,对多线程、线程池、网络编程、通信协议、数据库等相关技术栈更加熟悉,同时也对QT开发更有了解。对C/C++基础则更加熟练。