qt 心跳設計

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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章