Qt中的TCP心跳机制
最编程
2024-08-08 22:35:11
...
Qt之TCP心跳包
当Qt作为客户端程序,而服务器需要监控客户端的在线状态时,就需要Qt端发送心跳包。心跳包可以是TCP也可以是UDP,这里介绍TCP心跳包的实现方法。
心跳包通常要单开一个线程,在进程运行的过程中一直执行。
代码示例:
.h文件
#ifndef HEARTBEATTHREAD_H
#define HEARTBEATTHREAD_H
#include <QThread>
#include <QCoreApplication>
#include <QTimer>
#include <QTcpSocket>
#include <QHostAddress>
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.h>
//心跳包线程
heartbeatThread *ht = nullptr;
ht = new heartbeatThread;
ht -> start();
另外可以编写一个服务器端代码,用来测试客户端的心跳包是否正确发送。但是也只是测试而已,服务器端一般不能用Qt来实现,Qt不适合干这个233