網絡通信中的心跳設計是爲了判斷客戶端和服務器通信是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();