news 2026/10/30 6:17:19

基于 QT(C++)实现的(图形界面)IM 即时通讯软件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于 QT(C++)实现的(图形界面)IM 即时通讯软件

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

注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/30 4:53:26

如何设置VirtualLab Fusion结果的格式

摘要虽然为所需光学任务提供方便的工具,以获得快速和准确的结果,是任何光学仿真软件的主要目的,但多功能后处理的价值不应被低估。对结果数据外观的调整不仅可以满足期刊或报告中出版物的特定要求,而且还可以强调和突出结果中有趣…

作者头像 李华
网站建设 2026/10/30 2:41:14

破除生命特征与智慧混淆需建立清晰认知框架 |Disentangling Biological Traits and Wisdom: A Clear Cognitive Framework

破除生命特征与智慧混淆需建立清晰认知框架 —— 打破生命特征与智慧混淆的核心方法:从概念锚定到实践思辨,分层破除认知惯性 打破二者的混淆,核心是先从底层划清概念边界,再用可落地的判断标尺破除 “载体唯一性 属性关联性”…

作者头像 李华
网站建设 2026/10/28 15:52:38

HoRain云--Go语言循环语句全解析

🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…

作者头像 李华
网站建设 2026/10/28 11:43:02

人生意义 = 当下体验?

将“人生意义”与“当下体验”用等号相连,既是古老的东方智慧,也是现代心理学和神经科学关注的核心。 “当下体验”是构成人生意义最核心、最不可替代的“材料”,但人生意义的完整构建,还需要一个能将当下体验进行“编织、解读与超…

作者头像 李华
网站建设 2026/10/29 18:07:07

金融论坛服务方案:高保密性与高端接待的实施标准

金融论坛服务方案:高保密性与高端接待的实施标准在金融领域,高端论坛不仅是思想碰撞的平台,更是行业风向标与信任建立的桥梁。一场成功的金融论坛,其核心价值往往超越议题本身,深度嵌入于严谨的会议服务流程之中&#…

作者头像 李华