ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

QTcpSocket自动重连题 难道QTimer 还有坑?

2022-01-02 09:59:02  阅读:275  来源: 互联网

标签:MySocketImp void Widget timer 重连题 connect QTcpSocket port QTimer


 一直在弄 QT Tcp 客户端断线重连,之前方式为定时器槽触发后发起连接,如下,但定时器貌似不触发??????/

初版//

#include "mysocketImp.h"
MySocketImp::MySocketImp(QHostAddress ip, int port, int sockDesc, QObject *parent) :
    MySocket(sockDesc,parent), status(false),m_ip(ip),m_port(port)
{
    connect(this, SIGNAL(disconnected()), this, SLOT(dostateDisConnected()));
    connect(this, SIGNAL(connected()), this, SLOT(dostateConnected()));
    connect(&m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
    //m_timer.start(3000);
    //connect(&m_timer, &QTimer::timeout, this, &MySocketImp::slotTimeout);
}

MySocketImp::~MySocketImp()
{

}

void MySocketImp::Connect(const QHostAddress &ip, const int &port)
{
    /*this->connectToHost(ip,port);
    if(!this->waitForConnected(50))
    {
        QString str = this->errorString();
    }*/
    m_timer.setInterval(3000);
    m_timer.start();
    this->connectToHost(ip, port);
    if (!this->waitForConnected(50))
    {
        //m_timer.stop();
        QString str = this->errorString();
        /*m_timer.setInterval(3000);
        m_timer.start();*/
    }

}

void MySocketImp::slotTimeout()
{
    if(!status)
    {
        this->Connect(m_ip,m_port);//Connect
    }
}
void MySocketImp::dostateConnected()
{
    m_timer.stop();
    status = true;
}
void MySocketImp::dostateDisConnected()
{
    status = false;
    this->abort();
    m_timer.setInterval(3000);
    m_timer.start(3000);
}

//改版

#include "mysocketImp.h"
MySocketImp::MySocketImp(QHostAddress ip, int port, int sockDesc, QObject *parent) :
    MySocket(sockDesc,parent), status(false),m_ip(ip),m_port(port)
{
    connect(this, SIGNAL(disconnected()), this, SLOT(dostateDisConnected()));
    connect(this, SIGNAL(connected()), this, SLOT(dostateConnected()));
    //connect(&m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
    //m_timer.start(3000);
    connect(&m_timer, &QTimer::timeout, this, &MySocketImp::slotTimeout);
    m_timer.start(3000);
}

MySocketImp::~MySocketImp()
{

}

void MySocketImp::Connect(const QHostAddress &ip, const int &port)
{
    this->connectToHost(ip,port);
    if(!this->waitForConnected(50))
    {
        QString str = this->errorString();
    }
    //m_timer.setInterval(3000);
    //m_timer.start();
    //this->connectToHost(ip, port);
    //if (!this->waitForConnected(50))
    //{
    //    //m_timer.stop();
    //    QString str = this->errorString();
    //    /*m_timer.setInterval(3000);
    //    m_timer.start();*/
    //}
}

void MySocketImp::slotTimeout()
{
    if(!status)
    {
        this->Connect(m_ip,m_port);//Connect
    }
}
void MySocketImp::dostateConnected()
{
    //m_timer.stop();
    status = true;
}
void MySocketImp::dostateDisConnected()
{
    status = false;
    //this->abort();
    //m_timer.setInterval(3000);
    //m_timer.start(3000);
}

/参考//

class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
private slots:
    void readMessage();
    void displayError(QAbstractSocket::SocketError);
    void sendMessage();

    void connected();
    void disconnected();
    void onError(QAbstractSocket::SocketError);
    void onProgress();
private:
    QTcpSocket* tcpsocket;
    bool flag;
    QTimer timer;
    QString message;
    QPushButton* button;
};

Widget::Widget(QWidget* parent):
    QWidget(parent)
{
    button = new QPushButton("Send");
    QVBoxLayout* layout = new QVBoxLayout(this);
    layout->addWidget(button);

    connect(button,SIGNAL(clicked()),this,SLOT(sendMessage()));

    tcpsocket = new QTcpSocket(this);
    flag = false;
    //tcpsocket->abort();
    //tcpsocket->connectToHost("10.2.100.63",80);
    connect(tcpsocket,SIGNAL(readyRead()),this,SLOT(readMessage()));
    connect(tcpsocket,SIGNAL(connected()),this,SLOT(connected()));
    connect(tcpsocket,SIGNAL(disconnected()),this,SLOT(disconnected()));
    connect(tcpsocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(onError(QAbstractSocket::SocketError)));

    connect(&timer,SIGNAL(timeout()),this,SLOT(onProgress()));
    timer.start(1800);
}

Widget::~Widget()
{
}

void Widget::onProgress()
{
    if(flag == false)
    {
        tcpsocket->abort();
        tcpsocket->connectToHost("10.2.100.63",80);
    }
}

void Widget::readMessage()
{
    QString tag = tcpsocket->readAll();
    std::cout<<"tag:"<<tag.size()<<std::endl;
}

void Widget::displayError(QAbstractSocket::SocketError)
{
    qDebug() << tcpsocket->errorString();
}

void Widget::sendMessage()
{
    std::cout<<"write callback data."<<std::endl;
    tcpsocket->write("ok");    
}

void Widget::connected()
{
    flag = true;
}

void Widget::disconnected()
{
    flag = false;
}

void Widget::onError(QAbstractSocket::SocketError)
{
}

标签:MySocketImp,void,Widget,timer,重连题,connect,QTcpSocket,port,QTimer
来源: https://blog.csdn.net/zzwwgg1984/article/details/122273754

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有