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

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

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

编译环境:Qt 5.9.5

ui界面如图:

在这里插入图片描述

代码如下

tcpclient.h
#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <QWidget>
#include <QTcpSocket>
#include <QTimer>
#include <iostream>
#include <string>
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 <QHostAddress>
#include <QMessageBox>
#include <QDebug>

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连接的重连和断开重连可以通过以下步骤实现: 1. 创建一个QTcpSocket对象,并连接到指定的服务器IP和端口号: ``` QHostAddress hostAddress("127.0.0.1"); quint16 hostPort = 8888; tcpSocket = new QTcpSocket(this); tcpSocket->connectToHost(hostAddress, hostPort); ``` 2. 监听连接状态信号,当连接成功时发送数据或者接收数据,当断开连接时进行重连: ``` connect(tcpSocket, SIGNAL(connected()), this, SLOT(onConnected())); connect(tcpSocket, SIGNAL(disconnected()), this, SLOT(onDisconnected())); connect(tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); ``` 3. 在连接成功的槽函数中发送数据或者接收数据: ``` void MyClient::onConnected() { qDebug() << "Connected to server."; tcpSocket->write("Hello, world!"); } ``` 4. 在断开连接的槽函数中进行重连操作,例如设置一个定时器,在定时器超时时新连接: ``` void MyClient::onDisconnected() { qDebug() << "Disconnected from server."; QTimer::singleShot(5000, this, SLOT(reconnect())); } void MyClient::reconnect() { qDebug() << "Reconnecting to server..."; tcpSocket->connectToHost(hostAddress, hostPort); } ``` 5. 在错误信号槽函数中进行错误处理,例如打印错误信息: ``` void MyClient::onError(QAbstractSocket::SocketError error) { qDebug() << "Error:" << tcpSocket->errorString(); } ``` 通过以上步骤,可以实现TCP连接失败重连和断开重连功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值