(七)如何实现即时通信系统中用户的文字聊天功能?

news2025/2/24 15:17:21

文章目录

  • 一、引言
  • 二、实现用户文字功能
    • 2.1 使用QTextEdit控件实现用户输入文字消息
    • 2.2 实现文字消息的发送和接收
    • 2.3 实现文字消息的展示和管理
  • 三、解码接收到的文字消息
    • 3.1 接收数据并解码
    • 3.2 在客户端展示文字消息
    • 3.3 客户端关键代码展示
    • 3.4 服务端关键代码展示
  • 四、效果展示
  • 五、个人经验分享
    • 5.1 经验和总结
    • 5.2 遇到的问题和解决方案
  • 六、结语


一、引言

在现代社交交流中,文字聊天成为了人们互动交流的一种基本方式,即时通信系统也是如此。为了满足用户的文字聊天需求,实现稳定高效的文字消息传输至关重要。本文旨在介绍即时通信系统中用户文字功能的重要性和应用场景,同时简述使用TCP连接传输用户文字消息的基本原理。

二、实现用户文字功能

2.1 使用QTextEdit控件实现用户输入文字消息

用户可以使用QTextEdit控件在客户端输入文字消息。该控件是一个多行文本编辑器,具有设置文本颜色、字体、粗体、斜体等格式的功能,可以满足用户的文本编辑需求。

2.2 实现文字消息的发送和接收

用户输入文字消息后,需要通过TCP连接将消息发送给服务端。服务端收到消息后,可以将其转发给指定的用户。

在客户端,可以通过连接QTextEdit的文本改变信号,获取用户输入的消息。发送按钮的槽函数可以将消息打包成JSON格式,通过QTcpSocket发送给服务端。客户端也需要实现onReadyRead()槽函数,用于接收服务端发送的文字消息。接收到消息后,客户端可以将消息打包成QListWidgetItem,并插入到聊天记录列表中。

2.3 实现文字消息的展示和管理

客户端可以使用QListWidget控件实现文字消息的展示和管理。该控件可以展示多个列表项,每个列表项可以包含多个控件,可以自定义控件来展示不同类型的消息。在本例中,可以创建一个自定义控件,将其包含在QListWidgetItem中,用于展示消息发送者的头像、昵称和消息内容。当接收到一条新的消息时,客户端可以将其打包成QListWidgetItem,插入到聊天记录列表中。

三、解码接收到的文字消息

3.1 接收数据并解码

在客户端中,通过 QTcpSocket 类的 onReadyRead() 信号来接收从服务器传来的数据。
接收到数据后,通过 QJsonDocument 类将数据解析为 JSON 对象。
从 JSON 对象中获取消息的类型,如果是文字消息,则从中获取发件人 ID、时间戳、文字内容等信息。
解析获取到的内容,保存到消息列表中等待展示。

3.2 在客户端展示文字消息

使用自定义的类实现聊天框,该类继承自 QWidget 类。

通过 QListWidget 控件来展示聊天记录,每一条消息都显示在一个聊天气泡中。

在接收到文字消息后,创建一个新的聊天气泡,并将消息内容添加到其中。

在聊天气泡中添加时间戳和消息发件人的头像,以及对气泡的样式设置。

将聊天气泡添加到 QListWidget 控件中,展示出来。

3.3 客户端关键代码展示

// 给服务端发送数据
void chatBox::send_Message_Server(QString message) {
    qDebug() << "给服务端发消息 tcpSocket:" << socket;
    json["Type"] = "message";
    json["from"] = meId;
    json["nikeName"]=userNikeName;
    json["to"] = myFriendId;
    json["content"] = message;
    qDebug() << "from:" << meId
             <<"to:" << myFriendId
            <<"content:" << message;
    QJsonDocument doc(json);
    QByteArray data = doc.toJson();
    socket->write(data);
}

3.4 服务端关键代码展示

// 用户是否在线
void message::sendDataToClient(QHash<QString, QTcpSocket*> userHash,QJsonObject jsonObj){
    bool isUserOnline=true; // 假设用户在线
    QString to=jsonObj["to"].toString();
    for (auto iter = userHash.constBegin(); iter != userHash.constEnd(); ++iter) {
        if (iter.key() == to) { // 如果 to 与当前遍历的 userID 相等
            isUserOnline=false;
            QTcpSocket *socket = iter.value(); // 获取对应的 socket
            // 在这里可以向 socket 写入数据
            qDebug() << "已经找到该用户";
            // 构建QByteArray格式数据
            QJsonDocument document;
            document.setObject(jsonObj);
            QByteArray jsonData = document.toJson(QJsonDocument::Compact);
            socket->write(jsonData);
            break; // 如果找到了对应的 userID,可以直接跳出循环
        }
    }
    // 用户不在线
    if(isUserOnline){
        SavemessageDataBase(jsonObj); // 调用相应的函数给数据库中插入数据
    }
}

四、效果展示

在这里插入图片描述
在这里插入图片描述

五、个人经验分享

5.1 经验和总结

尽可能使用现有的控件和库来实现文字消息的输入、发送和展示,这样可以大大减少代码量和开发时间。

在处理文字消息发送和接收的时候,需要注意多线程问题,特别是在服务端的处理中,要使用多线程来保证程序的稳定性和可靠性。

在处理文字消息发送和接收的过程中,要注意对数据的加密和解密,以确保数据传输的安全性。

5.2 遇到的问题和解决方案

在处理文字消息发送和接收的过程中,遇到了消息过多时导致程序卡顿的问题,解决方案是使用多线程来处理消息,将UI线程和网络处理线程分开,保证程序的流畅性。

在处理文字消息发送和接收的过程中,遇到了数据传输不稳定导致数据丢失的问题,解决方案是加入数据重传机制和错误校验机制,确保数据的完整性。

六、结语

当今社会,即时通信系统已经成为人们日常生活中不可缺少的一部分,而文字功能作为其中的基础功能,更是被广泛使用。通过本文的介绍,我们了解了如何使用TCP连接实现用户文字消息的传输,以及如何在客户端展示和管理消息,帮助读者更好地理解和实现即时通信系统中的文字功能。

同时,本文也分享了在实现用户文字功能过程中的经验和总结,包括QTextEdit控件的使用和自定义气泡的实现等,以及遇到的问题和解决方案,如数据的编码和解码问题等。这些经验和总结能够帮助读者更好地理解和掌握实现用户文字功能的方法和技巧。

在未来,即时通信系统中的用户文字功能将继续发展和完善,例如支持多媒体消息、加密传输等新功能的引入。我们也将继续关注并研究这些新功能,并致力于提高系统的稳定性和可靠性,为用户提供更好的聊天体验。欢迎读者留言和讨论,分享你们的经验和看法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/506955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

干货 | 如何做一个简单的访谈研究?

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 心理学中研究中&#xff0c;大家常用的研究方法大多是实验法、问卷调查法等&#xff0c;这些均是定量研究。 其实&#xff0c;作为质性研究中常用的访谈法&#xff0c;可对个体的内心想法进…

【操作系统】从操作系统底层出发,成为更好的程序员

冯老爷子的模型 首先&#xff0c;我们从一个问题开始(&#xffe3;∇&#xffe3;)/ 为什么需要程序员&#xff1f; 早期的计算机程序是硬件化的&#xff0c;即使用各种门电路组装出一个固定的电路板&#xff0c;这个电路板只能用于执行某个特定的程序&#xff0c;如果需要修…

学生电费管理系统

随着现代化的发展和科技的进步&#xff0c;各种智能化的系统应运而生。其中&#xff0c;学生电费管理系统是一个非常实用的系统&#xff0c;它可以帮助学校管理电费&#xff0c;提高学生的电费管理意识&#xff0c;减少学校的电费支出。本文将着重介绍该系统的作用、特点以及优…

【hive】基于Qt5和libuv udp 的lan chat

作者已经不更新了,但是很棒 在线用户列表: 聊天窗口 主程序 单独的网络线程: network_thread data管理关联网络管理的 程序update升级更新 和消息收到 即可

【Java】面试常问知识点(数据库相关知识)

Redis Redis数据结构&#xff0c;跳表如何实现&#xff1f;跳表添加层级的时机&#xff1f; 布隆过滤器的底层原理 Redis数据结构 有5中数据结构&#xff0c;string&#xff08;字符串类型&#xff09;、list&#xff08;列表类型&#xff09;、hash&#xff08;哈希表类型…

Ubuntu 20.04 系统配置 OpenVINO 2022.3 环境

由于 OpenVINO 2021 版本在调用 IECore 时会出现 Segmentation fault 的问题&#xff0c;因此需要将其升级为 2022 版本的。 1. 卸载原来版本的 OpenVINO 进入OpenVINO的卸载目录&#xff0c;通常在 /opt/intel 文件夹下&#xff0c; cd /opt/intel/openvino_2021/openvino_…

SOA协议DDS和Some/IP对比

SOME/IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中。 SOME/IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术&#xff0c;所以它们之间注定有很大的区别。 SOME/IP SOME/IP的全称为&#xff1a;Scalable service-Oriented MiddlewarE over IP&#xff0c;是一种面向服务…

Codeforces Round 871 (Div. 4)【A、B、C、D、E、F、G、H】

文章目录 A. Love Story(模拟)B. Blank Space(模拟)C. Mr. Perfectly Fine&#xff08;模拟&#xff09;D. Gold Rush(小思维)E. The Lakes(DFS)F. Forever Winter(简单的图)G. Hits Different&#xff08;二维前缀和&#xff09;H. Dont Blame Me(状态压缩dp) 传送门 A. Love …

视频文本检索之CLIP4Clip

论文&#xff1a;CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval GitHub&#xff1a;https://github.com/ArrowLuo/CLIP4Clip 论文基于图片-文本检索模型CLIP (Contrastive Language-Image Pretraining)提出了视频-文本检索模型CLIP4Clip (CLIP …

【开源硬件篇】STM32F103C8T6主控板

STM32F103C8T6主控板 文章目录 STM32F103C8T6主控板设计目标一、STM32F103C8T6核心板外围引脚电路1.1 原理图设计1.2 PCB设计用例 二、ISP一键下载电路设计2.1 原理图设计2.2 原理分析2.2.1 CH340电路选择2.2.2 ISP一键下载原理 2.3 PCB设计示例 三、串口通信电路3.1 原理图设计…

Jackson2JsonRedisSerializer使用及问题

1、使用 public static RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {lettuceConnectionFactory.setShareNativeConnection(false);RedisTemplate<String, Object> rt new RedisTemplate<>();// 设置…

嵌入式软考备考_6 嵌入式程序设计

嵌入式程序设计 开发流程 要想某个功能要用硬件还是软件实现&#xff08;硬件快&#xff0c;但是耗资源&#xff09;&#xff1f;BSP&#xff1f;裸机还是OS&#xff1f; 硬件的设计与实现-》设备驱动软件的设计与实现-》os的选择&#xff0c;移植&#xff0c;api接口函数的…

openGL 环境搭建

刚入坑&#xff0c;每个包、每个项目都得重新配一遍&#xff0c;实在烦人&#xff0c;由于网上已有很多教程&#xff0c;故在此只简要介绍。 比较通用的安装方法如下&#xff1a; 优先下载&#xff0c;对应vs版本&#xff0c;32位&#xff0c;已经编译好的库。如果下载的是源代…

2023 年Java经典面试题,基础篇02(持续更新)

本篇文章主要讲的是 2023 年Java最新面试题&#xff0c;持续更新中 原文地址&#xff1a;https://github.com/Snailclimb/JavaGuide 面向对象基础 面向对象和面向过程的区别 两者的主要区别在于解决问题的方式不同&#xff1a; 面向过程把解决问题的过程拆成一个个方法&…

Git 配置多个SSH-Key

Git 全局配置 查看全局配置 git config --global --list git config --global user.name 删除全局配置 git config --global --unset user.name 1.生成ssh public key and private key open git base, 执行以下command&#xff0c;其中是keyname自己填&#xff1b;codeup…

java程序员容易被人误解?我来聊聊常见的三种情况

先说一下个人情况吧。21年来到深圳&#xff0c;现在马上工作满两年。我说程序员是一个容易被人误解的职业呢&#xff0c;可能在大部分人的印象里&#xff0c;程序员就是一个呆板、穿着格子衫、戴着厚厚的眼镜片、比较呆滞的一群人。其实这个印象可能是符合上个年代吧——程序员…

第二部分——长难句——第二章——复合句——第二节——定语从句

内容比较多&#xff0c;且比较重要 一&#xff0c;定语从句的概述 定语&#xff08;紧挨着名词&#xff09;礼让弱小&#xff0c;所以放在所修饰的名词后面。 法律是一种学科&#xff08;鼓励责任判定&#xff09;定语修饰 在翻译成中文的习惯&#xff0c;我们会把定语从句放…

倒计时|数字标准读书会—打破“信息孤岛”、拆除“数据烟囱”

业务与其他业务域间存在信息鸿沟&#xff0c;协作效率低下&#xff1b; 系统边界划分复杂混乱&#xff0c;技术标准不兼容&#xff1b; 新业务无法基于已有解决方案快速组装上线&#xff0c;迭代创新&#xff1b; …… 以上这些数字化转型痛点&#xff0c;你是否也遇到过&a…

家里网速越来越慢?路由器附近千万别放这几样东西

我们在日常生活中常常会使用到WiFi&#xff0c;当遇到网络卡顿、网速缓慢时往往感到疑惑&#xff0c;是不是自己的WiFi速度不够&#xff1f;其实除了无线路由器、终端等自身产品质量问题&#xff0c;还有许多外在因素。 在网络本身没有问题的情况下WiFi卡顿或不稳定&#xff0…

美国限制Unity和UE渲染引擎风险增加,数字孪生行业急需国产渲染引擎软件

数字孪生作为智能制造的关键技术之一&#xff0c;其应用已经从工业制造领域扩展到了城市规划、交通运输、农业等多个领域。然而&#xff0c;随着中美脱钩的持续进行&#xff0c;有关3D渲染引擎的“卡脖子”问题已经引起了行业的高度关注。 美国限制3D渲染引擎风险对数字孪生产…