我是靠谱客的博主 动人台灯,最近开发中收集的这篇文章主要介绍Qt中TCP保持心跳回复和断开重连1 注册套接字2 编写处理事件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 1 注册套接字
  • 2 编写处理事件
    • 2.1 客户端(保持心跳和断开重连)
    • 2.2 服务器

1 注册套接字

类声明中,声明变量

//是否是客户端
#define isClient 1

class ShowImage : public QWidget
{
    Q_OBJECT

public:
    ShowImage(QWidget *parent = nullptr);
    ~ShowImage();

private:
	//服务器专属,用于建立监听事件
	QTcpServer tcpServer;
	//TCP套接字(客户端和服务器都要用到)
    QTcpSocket* tcpSocket;
    //监听或者连接的ip地址
    QString IP = "192.168.0.1";
    //断开重连计时
    QTimer m_tcpServerTimer;
    //连接的状态
    bool m_tcpServerStatus = false;    
private slots:
    //回复心跳
    void dealHeartBeat();
    //连接服务器
    void connectionServer();   
    //处理接受数据
    void dealReceiveData();
    //服客户端处理连接后的事件
    void receiveConnect();
    //断开连接后的处理事件
    void tcpDisconnected();
    //显示错误
    void displayError(QAbstractSocket::SocketError);
};      

构造函数中定义事件

ShowImage::ShowImage(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::ShowImage)
{
    ui->setupUi(this);
#if isClient
    ///客户端
    //建立套接字连接
    tcpSocket = new QTcpSocket(this);
    //处理接受连接 &QTcpSocket::connected
    connect(tcpSocket, &QAbstractSocket::connected, this, &ShowImage::receiveConnect);
#else
    //服务器
    connect(&tcpServer, &QTcpServer::newConnection, this, &ShowImage::acceptConnection);
#endif

}

2 编写处理事件

2.1 客户端(保持心跳和断开重连)

  • 保持心跳:直接在receiveConnect()函数中,启动定时器,设置时间到后的处理事件,然后一定时间间隔后重启定时器
  • 重连:
    • m_tcpServerStatus:网络连接状态,成功时为true,失败时为false;
    • m_tcpServerTimer:用于重连的定时器,当网络连接成功时,停止定时器,当断开连接时,重启定时器
void receiveConnect()
{
	//客户端连接状态成功
    m_tcpServerStatus = true;
    
    //连接成功后计时停止
    m_tcpServerTimer.stop();

	//启动定时器:用于发送心跳
    QTimer *timer1= new QTimer(this);
     //连接定时器的信号与槽,定时时间一到就会发送 timeout() 信号,从而触发槽函数dealHeartBeat(处理心跳)
   connect(timer1, &QTimer::timeout, this, &ShowImage::dealHeartBeat);//心跳处理   
    //每隔 “time” 秒重启心跳定时器
    timer1->start(15000);//15000ms

    //接受数据
    connect(tcpSocket, &QAbstractSocket::readyRead, this, &ShowImage::dealReceiveData);
    //断开连接
    connect(tcpSocket, &QAbstractSocket::disconnected, this, &ShowImage::tcpDisconnected);//与断开重连有关
    //显示错误
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));

    //断开连接后,定时重连服务器(使用lambda表达式)
    connect(&m_tcpServerTimer, &QTimer::timeout, [=](){
        if(m_tcpServerStatus == false){
          tcpSocket->connectToHost(IP , 8899);
          //断开与服务器的连接
          //tcpSocket->abort();
       }
    });

}

断开连接的处理函数:

//断开连接时的处理
void ShowImage::tcpDisconnected()
{
    m_tcpServerStatus = false;
    //2秒重连,重启重连服务器的定时器
    m_tcpServerTimer.start(2000);
}

2.2 服务器

  • 处理心跳:在套接字处理函数dealReceiveData里面做心跳处理,当接受到的帧头和帧体是心跳时,给客户端回复心跳
//服务器用
void ShowImage::acceptConnection()
{
    //获得链接套接字
    tcpSocket = tcpServer.nextPendingConnection();

    //接受数据,
    connect(tcpSocket, &QAbstractSocket::readyRead, this, &ShowImage::dealReceiveData);
    
    //断开连接
    connect(tcpSocket, &QAbstractSocket::disconnected, this, &ShowImage::tcpDisconnected);
    //显示错误
    connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),
            this, SLOT(displayError(QAbstractSocket::SocketError)));
}
  • 服务器重新监听:
    监听:
    //开始监听
        if(!tcpServer.listen(QHostAddress(IP) , 8899)){
            qDebug() << tcpServer.errorString();
            close();
            return;
        }

断开监听:

        tcpServer.close();//断开服务
        tcpSocket->disconnectFromHost();//断开套接字

最后

以上就是动人台灯为你收集整理的Qt中TCP保持心跳回复和断开重连1 注册套接字2 编写处理事件的全部内容,希望文章能够帮你解决Qt中TCP保持心跳回复和断开重连1 注册套接字2 编写处理事件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部