zoukankan      html  css  js  c++  java
  • qt 心跳设计

     网络通信中的心跳设计是为了判断客户端和服务器通信是socket是否处于连接状态,服务端每隔一个固定的时间间隔给客户端放消息,客户端设计一个心跳类,类中有一个定时器,当socket接收到信息时,心跳类记录接到消息时的时间,然后判断在固定时间间隔内有没有接收到服务器端发来的信息,然后没有收到可以判断网络连接已经断开。

    心跳类:

    class HeartBeat : public QObject

    {
        Q_OBJECT
    public:
        HeartBeat(QObject *parent, int interval)
            : QObject(parent)
        {
            checkTimer = new QTimer(this);
            checkTimer->setInterval(interval);
            last = QDateTime::currentDateTime();
            connect(checkTimer, SIGNAL(timeout()), 
                    this, SLOT(check()));
        }
    
    
        ~HeartBeat() { delete checkTimer; }
        void beat()
        {
            if (!checkTimer->isActive())
                checkTimer->start();
            last = QDateTime::currentDateTime();
        }
    signals:
        void dead();
    private slots:
        void check()
        {
            if (last.secsTo(QDateTime::currentDateTime()) >= 30) {
                checkTimer->stop();
                emit dead();
            }
        }
    
    
    private:
        QDateTime  last;
        QTimer*    checkTimer;
    };

    服务器端发送心跳的方法各异,都是往socket中定时发送消息就可以
    客户端:
        socket = new StringTcpSocket(this);
        connect(socket, SIGNAL(dataRead(QString)), 
                this,   SLOT(onDataRead(QString)));

        heart = new HeartBeat(this, 30000);
        connect(heart, SIGNAL(dead()), this, SLOT(onDead()));


    onDead 函数中做一些网络已经断开后,数据的处理。
    然后在socket发送dataRead() 信号时的slot函数onDataRead() 函数中加入
    heart->beat();

    http://www.cnblogs.com/thorngirl/articles/3927914.html

  • 相关阅读:
    centos 6 关闭防火墙
    linux 卸载openJDK
    elasticsearch-head 配置
    elasticsearch6.5.x-centos6
    gitbook 安装和使用
    ubuntu 开启关闭mysql服务
    spring boot 项目使用idea正常打包后执行总是出现异常,解决办法
    idea导入配置SSM项目,并进行打包
    正则表达式规则
    Debug --> 对于pcap包中的某一packet的小分析
  • 原文地址:https://www.cnblogs.com/findumars/p/6142803.html
Copyright © 2011-2022 走看看