Qt 实现TCP 协议的断开重连

        在Qt中实现TCP断开重连,你可以使用QTcpSocket类,并结合QTimer来处理重连逻辑,在Qt中实现TCP断开后的自动重连功能,通常可以通过以下步骤进行:

1. 初始化QTcpSocket: 首先,需要创建一个QTcpSocket实例,并初始化它。

QTcpSocket *m_tcpSocket = new QTcpSocket(this);


2. 连接信号与槽: 连接disconnected()信号到一个槽函数,这个槽函数负责启动重连逻辑。

connect(m_tcpSocket, &QTcpSocket::disconnected, this, &YourClass::slotDisconnected);

3. 实现槽函数以处理断开连接: 在槽函数中,可以设置一个定时器来尝试重新连接。这样可以避免在连接立即失败的情况下反复尝试,给系统一些时间来恢复。

void YourClass::slotDisconnected()
{
    // 可以添加一些日志输出,表示已断开连接
    qDebug() << "Disconnected from server.";

    // 如果已经有定时器在运行(即正在尝试重连),则不启动新的定时器
    if (!m_reconnectTimer->isActive()) {
        m_reconnectTimer->start(RECONNECT_TIMEOUT); // RECONNECT_TIMEOUT是重试间隔,例如5000    毫秒
    }
}


4. 实现定时器槽函数以尝试重连: 当定时器时间到达时,槽函数会被调用,此时尝试重新连接服务器。

void YourClass::slotReconnect()
{
// 停止定时器
m_reconnectTimer->stop();

// 尝试重新连接到服务器
QString host = "your_server_ip";
quint16 port = 1234; // 服务器端口
m_tcpSocket->connectToHost(host, port);

if (!m_tcpSocket->waitForConnected(RECONNECT_WAIT)) { // RECONNECT_WAIT是等待连接的超时时间
qDebug() << "Failed to reconnect, will try again later.";
m_reconnectTimer->start(RECONNECT_TIMEOUT); // 重连失败,再次启动定时器
} else {
qDebug() << "Successfully reconnected to server.";
}
}

5. 初始化定时器: 在合适的地方(如构造函数)初始化定时器,并连接其timeout信号到重连槽函数。

m_reconnectTimer = new QTimer(this);
connect(m_reconnectTimer, &QTimer::timeout, this, &YourClass::slotReconnect);

注意:在实际应用中,你可能需要根据具体情况调整重连策略,比如增加重试次数限制,或者在尝试几次失败后让用户决定是否继续重试。此外,也发送心跳要检测是否与服务器连接。最后确保在对象生命周期结束时正确地清理资源,避免内存泄漏。

以下是一个简单的例子:

#include <QTcpSocket>
#include <QTimer>

class TcpClient : public QObject {
    Q_OBJECT
public:
    TcpClient(QObject *parent = nullptr) : QObject(parent) {
        socket = new QTcpSocket(this);
        connect(socket, &QTcpSocket::disconnected, this, &TcpClient::onDisconnected);
        connect(socket, &QTcpSocket::errorOccurred, this, &TcpClient::onError);
        reconnectTimer = new QTimer(this);
        connect(reconnectTimer, &QTimer::timeout, this, &TcpClient::tryToConnect);
        reconnectTimer->setInterval(2000); // 设置重连间隔为2秒
        reconnectTimer->setSingleShot(true); // 定时器只触发一次
    }

    void tryToConnect() {
        socket->abort(); // 断开当前连接
        socket->connectToHost("127.0.0.1", 1234); // 尝试重新连接
    }

private slots:
    void onDisconnected() {
        qDebug() << "Disconnected from server. Attempting to reconnect...";
        reconnectTimer->start(); // 开始重连定时器
    }

    void onError(QAbstractSocket::SocketError) {
        qDebug() << "Error occurred: " << socket->errorString();
        reconnectTimer->start(); // 开始重连定时器
    }

private:
    QTcpSocket *socket;
    QTimer *reconnectTimer;
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WRT1900ACS搭建openwrt服务器小记

参考链接 wrt1900acs openwrt wrt1900acs openwrt 刷机 wrt1900acs原生固件刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-factory.img wrt1900acs openwrt更新刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-sysupgrade.bin 通过WEB UI来…

醛固酮(Aldosterone)/Aldosterone ELISA kit--比色竞争法酶免疫检测试剂盒

醛固酮&#xff08;Aldosterone&#xff09;是一种由肾上腺皮质中的胆固醇合成的类固醇激素。醛固酮在肾脏和肝脏中代谢&#xff0c;并作为控制钠钾平衡的关键盐皮质激素发挥作用。肾上腺合成和释放醛固酮主要受肾素-血管紧张素-醛固酮系统&#xff08;RAAS&#xff09;的调节&…

call, apply , bind 区别详解 及 实现购物车业务开发实例

call 方法&#xff1a; 原理 call 方法允许一个对象借用另一个对象的方法。通过 call&#xff0c;你可以指定某个函数运行时 this 指向的上下文。本质上&#xff0c;call 改变了函数运行时的作用域&#xff0c;它可以让我们借用一个已存 在的函数&#xff0c;而将函数体内的 th…

ISIS学习第一部分——isis基本概念

目录 一.ISIS与OSI模型 1.IS-IS&#xff0c;中间系统到中间系统 2.ES-IS,终端系统到中间系统 二.NET——ISIS中的“IP地址” &#xff08;1&#xff09;NET有3个部分: 1.Area ID 2.System ID 3.SEL &#xff08;2&#xff09;.前面是可变长的&#xff0c;如何进行区分…

前端开发攻略---使用Sass调整颜色亮度,实现Element组件库同款按钮

目录 1、演示 2、实现原理 3、实现代码 1、演示 2、实现原理 改变颜色亮度的原理是通过调整颜色的 RGB 值中的亮度部分来实现的。在 Sass 中&#xff0c;可以使用颜色函数来操作颜色的 RGB 值&#xff0c;从而实现亮度的调整。 具体来说&#xff0c;亮度调整函数通常会改变颜…

使用 Docker 部署 TaleBook 私人书籍管理系统

1&#xff09;项目介绍 GitHub&#xff1a;https://github.com/talebook/talebook Talebook 是一个简洁但强大的私人书籍管理系统。它基于 Calibre 项目构建&#xff0c;具备书籍管理、在线阅读与推送、用户管理、SSO 登录、从百度/豆瓣拉取书籍信息等功能。 友情提醒&#x…

ansible------inventory 主机清单

目录 inventory 中的变量 2&#xff09;组变量[webservers:vars] #表示为 webservers 组内所有主机定义变量&#xff0c;所有组内成 员都有效 ansible_userrootansible_passwordabc1234 3&#xff09; [all:vars…

前置知识储备

基本认知 什么是模式 在一定环境中解决一些问题的方案&#xff08;通俗来说&#xff1a;特定环境中用固定的套路解决问题&#xff09; 什么是设计模式 设计模式是一套反复被人使用&#xff0c;多数人知晓的&#xff0c;经过分类编目的代码设计经验的总结 设计模式最终的目…

[笔试训练](十五)

目录 043:平方数 044:分组 045:拓扑排序 043:平方数 平方数 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 简单题&#xff0c;开根号之后判断左右两个数哪个离得近。 #include <iostream> #include <cmath> using namespace std; typedef long long…

电脑文件批量重命名不求人:快速操作,高效技巧让你轻松搞定

在数字化时代&#xff0c;电脑文件的管理与整理显得尤为重要。当面对大量需要重命名的文件时&#xff0c;一个个手动修改不仅耗时&#xff0c;还容易出错。那么&#xff0c;有没有一种方法可以快速、高效地完成这一任务呢&#xff1f;答案是肯定的&#xff0c;下面就来介绍几种…

温暖家居新风尚,能率壁挂炉——设计新风尚,体验再升级

随着家居品质要求的提升&#xff0c;现代人对家居的舒适性和设计感有了更高的追求。壁挂炉&#xff0c;作为现代家居中不可或缺的一部分&#xff0c;其重要性日益凸显。中国国际供热通风空调、卫浴及舒适家居系统展览会&#xff08;ISH China & CIHE&#xff09;将于2024年…

测评工作室的养号成本,效率,纯净度,便捷性等问题怎么解决?

大家好&#xff0c;我是南哥聊跨境&#xff0c;最近有很多做测评工作室的朋友找到南哥&#xff0c;问我有什么新的测评养号系统可以解决成本&#xff0c;效率&#xff0c;纯净度&#xff0c;便捷性等问题 测评养号系统从最早的模拟器、虚拟机到911、VPS、手机设备等&#xff0…

【深度学习实战(33)】训练之model.train()和model.eval()

一、model.train()&#xff0c;model.eval()作用&#xff1f; model.train() 和 model.eval() 是 PyTorch 中的两个方法&#xff0c;用于设置模型的训练模式和评估模式。 model.train() 方法将模型设置为训练模式。在训练模式下&#xff0c;模型会启用 dropout 和 batch norm…

|Python新手小白中级教程|第二十三章:列表拓展之——元组

文章目录 前言一、列表复习1.索引、切片2.列表操作字符3.数据结构实践——字典 二、探索元组1.使用索引、切片2.使用__add__((添加元素&#xff0c;添加元素))3.输出元组4.使用转化法删除元组指定元素5.for循环遍历元组 三、元组VS列表1.区别2.元组&#xff08;tuple&#xff0…

零门槛副业兼职!10种长期赚钱好方法!

想要实现财务自由&#xff0c;不能仅停留在梦想层面&#xff0c;更需要付诸实践。 以下是我从网络上精心整理的十大可靠的兼职副业建议&#xff0c;旨在助你一臂之力。 这些项目已根据推荐程度、难度水平、目标人群以及预期收入进行了细致分类。 我要强调的是&#xff0c;任…

Cosmo Bunny Girl

可爱的宇宙兔女郎的3D模型。用额外的骨骼装配到Humanoid上,Apple混合了形状。完全模块化,包括不带衣服的身体。 技术细节 内置,包括URP和HDRP PDF。还包括关于如何启用URP和HDRP的说明。 LOD 0:面:40076,tris 76694,verts 44783 装配了Humanoid。添加到Humanoid中的其他…

带EXCEL附件邮件发送相关代码

1.查看生成的邮件 2.1 非面向对象的方式&#xff08;demo直接copy即可&#xff09; ​ REPORT Z12. DATA: IT_DOCUMENT_DATA TYPE SODOCCHGI1,IT_CONTENT_TEXT TYPE STANDARD TABLE OF SOLISTI1 WITH HEADER LINE,IT_PACKING_LIST TYPE TABLE OF SOPCKLSTI1 WITH HEADER LIN…

AI编码工具-通义灵码初识

AI编码工具-通义灵码初识 通义灵码支持环境及语言代码安全性 通义灵码安装通义灵码登录 关于通义灵码的初识&#xff0c;还是得从2023云栖大会来说起。2023云栖大会带来了跨越式升级的千亿级参数规模大模型——通义千问2.0&#xff0c;随之而来的便有通义灵码&#xff0c;那么什…

SpringBoot项目配置HTTPS接口的安全访问

参考&#xff1a;https://blog.csdn.net/weixin_45355769/article/details/131727935 安装好openssl后&#xff0c; 创建 D:\certificate CA文件夹下包含&#xff1a; index.txt OpenSSL在创建自签证书时会向该文件里写下索引database.txt OpenSSL会模拟数据库将一些敏感信息…

嵌入式移植7Z解压缩(纯C)

本文分享一个纯C语言编写的7Z解压缩代码库&#xff0c;本代码库的主要目的是在嵌入式环境下使用7z解压缩文件&#xff0c;可以将升级包通过7z进行压缩&#xff0c;然后发送给设备&#xff0c;减小和设备传输过程中的文件大小&#xff0c;进而达到传输大文件的目的。 下载链接 …
最新文章