基于 QT(C++)实现的(图形界面)IM 即时通讯软件【100010586】
IM 即时通讯软件
1 引言
1.1 项目概述
本项目时北京理工大学计算机学院小学期实训项目。让我们练习了 Linux 环境下的 socket 编程,会使用终端指令来操作 Linux,同时熟悉 QT 在项目进程中构建 UI 和封装数据的作用,锻炼面向对象的编程思想,熟悉了 QT 的基本操作和语法,了解了 QTCP 在网络通信中的意义。
1.2 需求分析
通信是人们生活中的一部分,而对于多人协作的工程而言,沟通和交流更是必要的,而网络通信作为其中最为便利的方式,已经是越来越多的公司在做工程时所要优先考虑的。而我们的项目就是基于这一需求,提供同一局域网下的多人通信。
1.3 运行环境
Linux 操作系统
QT5 及以上版本
2 项目设计
2.1 设计思路
注册登录模块:
使用 QT 搭建服务器和客户端。服务器和客户端之间使用 socket 来建立连接。要求在打开客户端时能够和服务器自动连接。用户填写的用户名和密码在客户端通过套接字来发送到服务器,并在服务器的数据库中匹配是否有相应的账号密码,有则登录,无则返回 0,提示错误。注册时,在客户端检测两次密码输入是否一致,不一致进行提示,一致则发送到服务器,并写入服务器数据库,用于登录时检测使用。
主界面:
主要是用于显示已有好友,我们参考了 QQ 的主界面,点击好友用户名可以进行聊天,这个界面还添加了聊天室功能,可以和已有好友进行多人聊天,还有一个功能就是点击右上角的加号可以添加好友,弹出的搜索窗口可以对现有账号进行搜索,并发送好友邀请。
2.2 模块功能介绍
登录注册模块:给每个需要通信的用户分配一个账号来区分身份,对已有账号的客户可以选择登录直接登入软件,没有账号的用户可以选择注册功能来注册一个新的账号用来登入。
主界面:用来显示已添加的好友和各功能按钮
聊天室:将所有加入某一 IP 地址连接的服务器的用户联系在一起,某一用户在其中发送消息后,广播给其他连入本服务器的用户。
聊天界面:聊天界面用于和某一用户进行通信,以及传输文件。
网络通信部分:
鉴于 QT 良好的封装性非常便利,所以我这部分是基于 QTCPsocket 开发的。在通信时,服务器监听所有的 IP 地址来的通信请求,并给每一个连接接进来的用户提供一个独立的套接字。客户端向特定的 IP 地址发送一个通信连接请求,服务器分配一个套接字给客户端通信。客户端发送消息给服务器,服务器将消息接收处理,并给所有连接进这个服务器的客户端来转发这个消息,实现局域网的多人通信。
2.3 模块结构图
2.4 程序流程图
2.5 功能设计分工
登录注册功能:
搭建登录注册服务器和数据库,要求客户端能够将文本框中的消息发送到服务器,并与数据库中的数据进行互动检测,确认用户名和密码是否正确匹配。能够在用户错误填写或者账号不匹配时给出相应的提示。
聊天通信功能:
搭建通信服务器,要求客户端能够连接到一个特定 IP 地址的服务器中,并且与其他连接到此 IP 地址服务器的客户端之间相互通信。
构建聊天室和聊天框的界面和功能按钮。
能够向单独的 IP 地址客户端进行通信与发送文件。
主界面构建:
搭建注册登录之后的主界面,完成好友列表和用户信息的排版,构建主界面到聊天室和聊天框的交互按钮。将网络通信模块和注册登录界面通过主界面进行连接。
UI 设计构建:
负责将其他人员为完成交互所设计的必要界面进行美化和重新设计构建,对其他的界面内容进行 UI 设计。必要图片资源的搜索和写入。
3 详细设计
使用 QT 搭建服务器和客户端。服务器和客户端使用 socket 来建立连接。IP 地址和端口号均可填写,在填写后通过 connecttoHost 函数来建立对特定 IP 地址服务器的连接。当用户在文本编辑框输入文本并且发送时,将信息写入 data,传输到服务器,服务器检测消息内容和消息长度,解析后广播给所有的连入此服务器的客户端。对于服务器而言,通过 listen 函数来监听连接,对于每一个连接的客户端来分配一个 socket,并存入 QList,通过 Qlist 来检测所有连入的客户端,并用于消息广播。
4 实现方案
服务器中用 listen 进行监听。客户端填入想要连接的服务器的 IP 地址和端口号,在点击进入聊天室时,使用 connecttoHost 来进行连接。当服务器监听到一个连接时,会根据 socket 给客户端分配一个独立的 socket 来进行通信,并存储在一个 QList 列表当中。
当客户端文本框中写入消息并且发送时,服务器使用 readyread()和 datarecvive()槽函数来进行接收,并将信息用 slotsend()函数来广播到所有处在 Qlist 列表中的 socket 对应的客户端中。
当客户端断开连接时,服务器会将它所对应的套接字 socket 从 Qlist 列表中剔除。
运行截图:主服务器,点击 connect 启动
聊天室服务器,点击创建聊天室启动
登录注册界面,填入用户名和密码登录,未连接服务器、密码错误都会提示,点击注册进入注册页面
登录完成进入主界面,点击下方进入聊天室可以进入聊天室
默认端口为 8010,填入连接 IP 点击进入聊天室即可进入,输入消息,点击发送即可发送消息。
点击好友头像进入私聊,文本编辑框中输入消息点发送即可发送,会自动检测消息时间并且显示在框中。
5 系统测试
bug:客户端和服务器不能连接
修正方法:取消掉防火墙对于公用网络下的保护。
bug:服务器不显示从客户端接收到的消息
修正方法:服务器只用 read()接收了消息,未写输出函数显示。
bug:服务器接收消息时,输出乱码
修正方法:若同时写两个 connect()函数,并且都用 readyread()启动,后面的读取函数会默认执行第一个,可以在消息中设计区别符号来判断。
♻️ 资源
大小: 22.5MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87404317
相关文章
- Qt-QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connect...
- Qt使用QSound播放声音(支持WAV,不支持MP3)
- Qt-共享内存QSharedMemory
- 机器学习笔记 - 在QT/PyTorch/C++ 中加载 TORCHSCRIPT 模型
- Qt音视频开发19-海康sdk录像存储
- Qt编写安防视频监控系统7-全屏切换
- Qt开源作品12-硬盘容量控件
- Qt编译数据库插件通用步骤说明
- paip.c++ qt 共享库dll的建立
- paip.提升用户体验---c++ qt 取消gcc编译的警告信息.txt
- paip. c++ doxygen 文档工具的使用以及跟QT CREATOR的集成
- paip.c++ qt 图片处理 检测损坏的图片
- Qt/C++ 加入轻便性能收集器
- QT中this指针
- C++Qt开发——阻止系统休眠方法
- C++ Qt开发——写日志文件
- 在Qt(C++)中使用QThread实现多线程
- 【Qt】在ubuntu上安装qt的mqtt模块
- VS中c++文件调用c 函数 ,fatal error C1853 预编译头文件来自编译器的早期版本号,或者预编译头为 C++ 而在 C 中使用它(或相反)
- Qt如何disconnect一个lambda匿名函数
- qt交叉编译报错::-1: error: arm-linux-g++: Command not found
- qt交叉编译报错::-1: error: The Qt version is invalid: Qt version is not properly installed,please run make