日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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_OBJECTpublic: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);//將進入服務器的標志位置為falsestatus = 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); //連接斷開時開啟定時器,定時時間為2sstatus == 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客户端与服务器断开连接自动重联机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。