Qt之TCP心跳包

Qt之TCP心跳包

当Qt作为客户端程序,而服务器需要监控客户端的在线状态时,就需要Qt端发送心跳包。心跳包可以是TCP也可以是UDP,这里介绍TCP心跳包的实现方法。

心跳包通常要单开一个线程,在进程运行的过程中一直执行。

代码示例:

.h文件

#ifndef HEARTBEATTHREAD_H
#define HEARTBEATTHREAD_H

#include 
#include 
#include 
#include 
#include 

using namespace std;

class heartbeatThread : public QThread
{
    Q_OBJECT

public:
    explicit heartbeatThread(QObject *parent = nullptr);
    void run(); //任务处理线程

    ~heartbeatThread(){
        delete tcpSocket;
        tcpSocket = nullptr;
    }

public slots:

private:
    QTcpSocket *tcpSocket = nullptr;
};

#endif // HEARTBEATTHREAD_H

.cpp文件

#include "heartbeatthread.h"

heartbeatThread::heartbeatThread(QObject *parent)
{
}

void heartbeatThread::run()
{
    tcpSocket = new QTcpSocket();
    tcpSocket->connectToHost(QHostAddress("127.0.0.1"), 2121); //服务器IP, 端口号
    while(true){
        //等待连接成功
        if(!tcpSocket->waitForConnected(30000))
        {
            tcpSocket->connectToHost(QHostAddress("127.0.0.1"), 2121);
        }
        else
        {
            QByteArray block = "heartbeat"; // 这里编辑心跳包内容
            tcpSocket->write(block);
            tcpSocket->flush();
        }
        QEventLoop eventloop;
        QTimer::singleShot(3000, &eventloop, SLOT(quit())); // 每隔3秒发送一次心跳
        eventloop.exec();
    }
}

开启后会每隔3秒向服务器发送一次心跳,例程可以判断连接状态,重新连接后也可以继续发送心跳,与服务器完全独立。

最后在main函数中开启线程。

main.cpp

#include 

    //心跳包线程
    heartbeatThread *ht = nullptr;
    ht = new heartbeatThread;
    ht -> start();

另外可以编写一个服务器端代码,用来测试客户端的心跳包是否正确发送。但是也只是测试而已,服务器端一般不能用Qt来实现,Qt不适合干这个233

你可能感兴趣的:(Qt,socket,qt)