QTcpSocket自动重连题 难道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)
{
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值