[Qt] TCP客户端与服务器断开连接自动重联机制

TCP服务器断开连接自动重联机制

客户端加入定时器实现断线重联(客户端服务端代码见上一篇博客)

编译环境:Qt 5.9.5

ui界面如图:

[Qt] TCP客户端与服务器断开连接自动重联机制_第1张图片

代码如下

tcpclient.h

#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include 
#include 
#include 
#include 
#include 
using namespace std;



namespace Ui {
class TcpClient;
}

class TcpClient : public QWidget
{
    Q_OBJECT

public:
    explicit TcpClient(QWidget *parent = 0);
    ~TcpClient();

protected:
    void newTcpConnect();
    void init();

private slots:

    //void on_pushButtonEnter_clicked();
    void slotconnectedsuccess();  //处理连接成功的信号
    void slotreceive();   //接收服务器传过来的信息
    void on_pushButtonSend_clicked();
    void slotdisconnected();  //处理离开聊天室的信号

    void slotTimeout();  //处理timeou信号

    void connectButton();


private:
    Ui::TcpClient *ui;
    bool status;     //用来判断是否进入了服务器
    size_t strSize;
    int port;
    QHostAddress *serverIP;
    QString userName;
    QTcpSocket *tcpsocket;
    QTimer m_timer;

};

#endif // TCPCLIENT_H

tcpclient.cpp

#include "tcpclient.h"
#include "ui_tcpclient.h"
#include 
#include 
#include 

TcpClient::TcpClient(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::TcpClient)
{
    ui->setupUi(this);
    //将进入服务器的标志位置为false
    status = false;
    //未连接内不能发送信息
    ui->pushButtonSend->setEnabled(false);

    init();
}

TcpClient::~TcpClient()
{
    delete ui;
}


void TcpClient::init()
{
    port = 8888;
    ui->lineEditServerPort->setText(QString::number(port));

    QString ip = ui->lineEditServerIp->text();

    userName = ui->lineEditUserName->text();

    tcpsocket = new QTcpSocket(this);
    //tcpsocket->connectToHost(ip, port);


    connect(ui->pushButtonEnter, &QPushButton::clicked, this, &TcpClient::connectButton);
    connect(tcpsocket, &QTcpSocket::connected, this, &TcpClient::slotconnectedsuccess);
    connect(tcpsocket, &QTcpSocket::readyRead, this, &TcpClient::slotreceive);
    connect(tcpsocket, &QTcpSocket::disconnected, this, &TcpClient::slotdisconnected);
    connect(&m_timer, &QTimer::timeout, this, &TcpClient::slotTimeout);

}

void TcpClient::connectButton()
{
    if(ui->pushButtonEnter->text() == "连接服务器") {
        newTcpConnect();
        //tcpsocket->disconnectFromHost();
    }
    else if(ui->pushButtonEnter->text() == "离开服务器") {
        tcpsocket->disconnectFromHost();
        //newTcpConnect();
    }
}



//用来处理连接成功的信号
void TcpClient::slotconnectedsuccess()
{
    m_timer.stop();   //连接成功后定时器停止
    status = true;

    ui->textEdit->append("连接成功");
    ui->pushButtonSend->setEnabled(true);
    ui->pushButtonEnter->setText("离开服务器");   

    QString msg = userName + ": connected";
    tcpsocket->write(msg.toUtf8().data());
}


void TcpClient::slotreceive()
{
    QByteArray array = tcpsocket->readAll();

    QString strHead = QString(array).section("  ", 0, 0);
    QString strText = QString(array).section("  ", 1, 1);

    QString buf = userName + ":";

    if(strHead == buf) {
         ui->textEdit->append(buf + strText);
    }

}

void TcpClient::on_pushButtonSend_clicked()
{
    //获取编辑区内容
    QString str = ui->lineEditSend->text();

    //加头信息
    qint64 textSize = str.size();
    QString strHead = QString("%1##%2##%3").arg(userName + ": ").arg(textSize).arg(str);
    tcpsocket->write(strHead.toUtf8().data());

    ui->lineEditSend->clear();
}

void TcpClient::slotdisconnected()
{   
    m_timer.start(2000);    //连接断开时开启定时器,定时时间为2s
    status == false;

    ui->textEdit->append("断开连接");

    ui->pushButtonSend->setEnabled(false);
    ui->pushButtonEnter->setText("连接服务器");


}


void TcpClient::slotTimeout()
{
    qDebug() << "重联服务器222222222";
    if(status == true) {
        qDebug() << "重联服务器";

        ui->textEdit->append("重联服务器...");
        newTcpConnect();
    }
}

void TcpClient::newTcpConnect()
{
    tcpsocket->abort();
    port = 8888;
    ui->lineEditServerPort->setText(QString::number(port));
    QString ip = ui->lineEditServerIp->text();

    tcpsocket->connectToHost(ip, port);
    if (!tcpsocket->waitForConnected(3000)) {
        //连接时长为3s,超过3秒连不上则输出错误信息
        //QMessageBox::warning(this, "错误", "连接超时");
    }

}


你可能感兴趣的:([Qt] TCP客户端与服务器断开连接自动重联机制)