QTcp-心跳

2023-11-06

心跳机制,大致实现两中,心跳发起的主动方为谁,server或client。其基本思路,是在一定时间间隔内模拟server和client的通信。所以,这就比一般通信多了时间属性,而非随意进行交互。这里,我们将client作为主动方,其过程如下:

  • client连接server成功后,即开始心跳,
  • 定时器,定时向server发送,并内置计数,当计数大于一个定值即判断为掉线,
  • server收到心跳请求,向client反馈,并计数清零。

Heart封装

Heart::Heart(QObject *parent) : QObject(parent)
{
    m_ptrTimer = new QTimer(this);
    connect(m_ptrTimer, &QTimer::timeout,[this](){
        // 掉线
        if(m_count > 2)
        {
            m_count = 0;
            m_ptrTimer->stop();
            emit sig_heartBad();
            return;
        }
        m_count++;
        // 心跳请求
        emit sig_heartTest();
    });
}

Heart::~Heart()
{
}

void Heart::slot_heartTest()
{
    // 计数清零
    m_count = 0;
}

void Heart::slot_startHeart()
{
    m_ptrTimer->start(500);
}

Server如下

TcpServer::TcpServer(QObject *parent)
    :QTcpServer(parent)
{
    qDebug() << "server listen ret " << listen(QHostAddress::LocalHost, 4578);
}

void TcpServer::incomingConnection(qintptr socketDescriptor)
{
    TcpSock *sock = new TcpSock(socketDescriptor);
    // 连接成功,开始心跳
    sock->write("OK");

    // 心跳反馈
    connect(sock, &TcpSock::readyRead, [=](){
        QByteArray bytes = sock->readAll();
        if(QString(bytes) == "TEST"){
            sock->write("TEST_BACK");
        }
    });

    m_mapSocks.insert(socketDescriptor, sock);
}

Client 如下

TcpSock::TcpSock(qintptr desc, QObject *parent)
    :m_desc(desc),QTcpSocket(parent)
{
    setSocketDescriptor(m_desc);
}

TcpSock::TcpSock(QObject *parent)
    :QTcpSocket(parent)
{
}

void TcpSock::initData()
{
    connectToHost(QHostAddress::LocalHost, 4578);

    connect(this, &TcpSock::readyRead, [this](){
        QByteArray bytes = this->readAll();

        // 连接成功
        if(QString(bytes) == "OK"){
            m_pHeart = new Heart;
            // 开始心跳并请求
            m_pHeart->slot_startHeart();
            connect(m_pHeart, &Heart::sig_heartTest, [this](){
                this->write("TEST");
            });

            connect(this, &TcpSock::sig_hearTestBack, m_pHeart, &Heart::slot_heartTest);

            // 掉线重连 TODO
            connect(m_pHeart, &Heart::sig_heartBad, [this](){
                connectToHost(QHostAddress::LocalHost, 4578);
            });
        }

        // 心跳反馈
        if(QString(bytes) == "TEST_BACK")
        {
            emit sig_hearTestBack();
        }
    });
}

待善

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QTcp-心跳 的相关文章

  • 来自另一个类的 Qt C++ GUI 调用

    我通过 gui 拖放创建了一个按钮和一个文本浏览器 UI 以及单击按钮功能是在 mainwindow cpp 中创建的 有一个 main cpp 但这是无关紧要的 因为在单击开始按钮之前程序不会启动 include mainwindow h
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 为什么总是在 mouseDoubleClickEvent 之前调用 mousePressEvent

    请考虑以下代码 include
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum
  • 如何将枚举类传递给 QML?

    我正在学习QML with Qt并在通过时遇到一些麻烦enum class to qml 当我使用信号时int参数 一切正常 代码运行完美 But 麻烦就在这里 如果我使用信号与一些enum class我有参数undefinedqml 信号
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • QML改变图像颜色

    我搜索了如何对图像进行着色 格式为 svg 或 png 我尝试用一 个填充图像的矩形覆盖我的图像 但由于我的图像不是矩形 它会给整个矩形着色 而不仅仅是图像 可以用qml改变图像颜色吗 或者 是否可以使用 QPixmap 更改 qt 使用
  • Qt 编译器标志顺序

    我的目标是消除某些类型的编译器警告 我发现可以通过在 pro 文件中添加编译器标志来做到这一点 QMAKE CXXFLAGS Wno unused variable Wno reorder 问题是它们被添加在 Qt 构建系统生成的标志之前
  • Qt 创建者 4.8.4。 Windows 7 - 64 位安装

    我在 QT 方面遇到了一些困难 我需要在学校使用它来完成一些 GUI 应用程序 我最近完成了以下步骤 1 mingw get inst 20120426 exefrom 来源锻造 http sourceforge net projects
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 在Qt中,如何正确实现委托?

    我遵循模型 视图 控制器范例 我很确定模型和视图是正确的 但我认为我的代表做错了一些事情 一切都 有效 除了第一次单击控件只是 点亮控件 而第二次单击与之交互之外 这是代表通常的实施方式吗 我的实现需要大量的构造和销毁 由scoped pt
  • 如何在Qt3D中优化点云渲染

    我正在尝试使用 Qt3D 显示大型点云 20M pts 我第一次发现这个图书馆https github com MASKOR Qt3DPointcloudRenderer https github com MASKOR Qt3DPointc
  • QT C++ QRegularExpression 多个匹配

    我想使用正则表达式从 QString html 中提取信息 我明确想使用正则表达式 无解析器解决方案 和类Q正则表达式 http qt project org doc qt 5 0 qtcore qregularexpression htm
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • 在另一个中使用 QAbstractListModel

    我在尝试使用 Qt QML 为我的应用程序开发数据模型时遇到问题 我已经用过一个QAbstractListModel能够将海关数据模型从 C 传递到 QML 并且它对于简单模型 例如基于字符串和布尔的模型 来说就像一个魅力 但现在我需要建立
  • Qt 和 MOC 的困境与简单的制作

    我想这更像是一个 GNU Make 问题 而不是 Qt 和 moc 但这里是 我有一个包含多个目录Q OBJECTS 我有一些简单的代码 它收集所有这些 例如 MOCS shell grep l Q OBJECT HEADERS Assum
  • PyQt:如何通过匿名代理使用网页

    这真让我抓狂 我想在 QWebPage 中显示一个 url 但我想通过匿名代理来实现 Code setting up the proxy proxy QNetworkProxy proxy setHostName 189 75 98 199
  • Qt - 意外的 GDB 退出

    我正在尝试开发一个应用程序 该应用程序创建图像并使用双线性插值填充颜色像素 然后显示它 到目前为止我的代码如下 include
  • Qt QML MenuItem iconSource不显示

    我有一个非常简单的设置只是为了说明问题 import QtQuick Controls 1 4 import QtQuick Window 2 2 ApplicationWindow visible true width 640 heigh
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码

随机推荐

  • Java 多线程 --- 线程同步 volatile关键字

    Java 多线程 线程同步 volatile关键字 volatile keyword 使用volatile保证可见性 使用volatile禁止指令重排 volatile keyword Volatile是Java虚拟机提供的轻量级的同步机制
  • 【unity记录】导入标准资源包(Standard Assets)

    想导入一些后期效果试试看 按书上的步骤行不通了 书已经是几年前的了 旧版本的方式是 Assets gt Import Package gt Effects 新版本以后只有Custom Package了 所以只能从AssetsStore下载标
  • Linux中_使用 df_du_命令_查看磁盘空间文件大小

    文章目录 Linux 查看磁盘空间 Linux 查看磁盘空间可以使用 df 和 du 命令 1 df 2 du 3 其他一些可以查看详细linux系统信息的命令和方法 Linux 查看磁盘空间 Linux 查看磁盘空间可以使用 df 和 d
  • 经验模态分解法简析 (转)

    http blog sina com cn s blog 55954cfb0102e9y2 html 美国工程院士黄锷博士于1998年提出的一种信号分析方法 重点是黄博士的具有创新性的经验模态分解 Empirical Mode Decomp
  • sql语句练习50题(Mysql版)

    表名和字段 1 学生表 Student s id s name s birth s sex 学生编号 学生姓名 出生年月 学生性别 2 课程表 Course c id c name t id 课程编号 课程名称 教师编号 3 教师表 Tea
  • 使用Python制作疫情数据分析可视化图表(三)

    python小白 在 一心学 公众号学习了一点疫情数据分析可视化的课程 记录下来 供小白参考 目录 一 基本数据的查看和初步处理 二 时间序列与区域划分 三 快速查看不同省市疫情现状 四 累计确诊病例走势 五 不同省市确诊新增情况 六 全国
  • 如何启动docker服务

    Docker Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 然后发布到任何流行的 Linux或Windows操作系统的机器上 也可以实现虚拟化 容器是完全使用沙箱机制 相互之间不会有任何接
  • imagenet val 按类别分类

    前言 有时候想看imagenet下某个类别的效果 但它又没划分 之前看了这篇文章将ImageNet的验证集val数据分类到不同文件夹中 但不是很清楚那代码 本文基于它的代码去做更改 把这个下下来 https raw githubuserco
  • React Native_手把手教你做项目(二.视频列表页布局&Mock虚拟数据)

    我们继续在上一篇文章的基础上编写我们的应用程序 视频列表页List 我们先写垃圾代码 把整个的架子搭起来 然后如果有其他页面通用的组件的话 我们再进行封装处理 ListView布局 list js文件 import React Compon
  • 内部类、枚举、Object类

    内部类 定义在一个类的内部的类 作用 1 内部类和外部类可以互相访问其成员 2 通过内部类 可以实现多继承 3 缺点 结构复杂 代码可读性不强 分类 成员内部类 1 不能有static属性和方法 原理同局部变量不能用static修饰 但是s
  • NumPy库学习笔记(未完)

    NumPy库 这篇文章主要内容来源于Python Numpy 教程 NumPy 中文和python常用库 NumPy 和 sklearn入门 ML小菜鸟 博客园 cnblogs com 1 1 导入NumPy库 import numpy a
  • VS Code常用插件安装及使用

    C C 开发常用插件安装 C C 在C C 开发中 这个肯定是必须的 C C Snippets C C 重用代码块 C C Advanced Lint C C 静态检测 Code Runner 代码运行 Include AutoComple
  • 小程序如何获取当前的天气预报

    大家好 我是陈楠酒肆 今天我为大家分享的是小程序获取当前的天气预报 我们先看看效果图 在实现这个效果之前我们需要引用一个JS文件 就是amap wx js 这个文件可以在我的交流群里下载 由于这里我使用了高德地图密钥 因此 大家还需要在高德
  • 论文研读 —— 10. PCA-Kalman: device-free indoor human behavior detection with commodity Wi-Fi (2/3)

    文章目录 3 2 Online behavior testing phase 4 Experimental setup 4 1 Hardware testbed 4 2 Experimental scenarios 3 2 Online b
  • 设计之星 ai_“AI创新之星”评选活动征集工作已启动,6月15日止,速来!

    为了推动人工智能与实体经济发展的深度融合 充分展示国内企业和创业团队在人工智能领域的创新成果 中国人工智能 多媒体信息识别技术竞赛 组委会在竞赛期间组织开展 AI创新之星 评选活动项目征集工作 评 选 范 围 评选主要围绕 深化融合应用 培
  • randomforestregressor参数详解

    randomforestregressor参数详解 sklearn ensemble RandomForestRegressor n estimators 10 数值型参数 默认值为100 此参数指定了弱分类器的个数 设置的值越大 精确度越
  • 【JAVA基础】核心机制

    b站大学课程笔记 下面是课程链接 https www bilibili com video BV1364y1k7WG p 11 spm id from pageDriver vd source b53165477127ff81132dc79
  • 编译gnome-sharp-2.20.1出错

    To solve the problem gtk2 development library must be installed Under CentOS this can be done with yum groupinstall Deve
  • 密码正则

    正则一 密码正则 密码需包含字母 符号或者数字中至少两项且长度超过6位数 最多不超过16位数 const regPwd str gt let zmReg A Za z 大小写字母 let numReg 0 9 数字 let zfReg A
  • QTcp-心跳

    心跳机制 大致实现两中 心跳发起的主动方为谁 server或client 其基本思路 是在一定时间间隔内模拟server和client的通信 所以 这就比一般通信多了时间属性 而非随意进行交互 这里 我们将client作为主动方 其过程如下