溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于Qt的TCP怎么實現(xiàn)通信

發(fā)布時間:2022-08-23 10:22:10 來源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了基于Qt的TCP怎么實現(xiàn)通信的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇基于Qt的TCP怎么實現(xiàn)通信文章都會有所收獲,下面我們一起來看看吧。

一、tcp介紹

TCP是面向連接的可靠傳輸?shù)膮f(xié)議,協(xié)議規(guī)定通信的雙方是服務(wù)端和客戶端的兩個角色:
服務(wù)端:負(fù)責(zé)監(jiān)聽網(wǎng)絡(luò)端口,等待客戶端的連接,用連接的socket完成信息的交互;
客戶端:負(fù)責(zé)每次連接的發(fā)起,建立連接后才可以進(jìn)行通信;

二、界面設(shè)計

服務(wù)器

基于Qt的TCP怎么實現(xiàn)通信

客戶端

基于Qt的TCP怎么實現(xiàn)通信

三、具體程序設(shè)計

(1)服務(wù)器端設(shè)計

1、建立一個工程,工程名為tcpserver,類名為server。在.pro文件中加入如下代碼并保存。

QT       += network

2、進(jìn)入server.h,添加類的前置聲明

class QTcpServer;   //QTcpServer類的前置聲明
class QTcpSocket;   //QTcpSocket類的前置聲明

添加私有對象指針

QTcpServer *tcpServer;          //添加QTcpServer私有對象指針
QTcpSocket *socket;             //添加QTcpSocket私有對象指針

添加私有槽聲明

 void tcpServer_connect();       //連接函數(shù)
 void read_data();               //讀取從client發(fā)來的信息
 void disconnected();            //斷開連接
 void on_sendButton_clicked();   //發(fā)送數(shù)據(jù)函數(shù)

3、轉(zhuǎn)到server.cpp文件中

添加頭文件#include,然后編寫構(gòu)造函數(shù)構(gòu)造函數(shù)

Server::Server(QWidget *parent) :            //構(gòu)造函數(shù)
    QDialog(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);
    tcpServer = new QTcpServer(this);                                             //創(chuàng)建對象
    if(!tcpServer->listen(QHostAddress::LocalHost,6666))                          //調(diào)用listen監(jiān)聽到來的連接,一旦有客戶端連接到服務(wù)器,就發(fā)射newConnection信號
    {
        qDebug()<<tcpServer->errorString();
        close();
    }
    ui->sendButton->setEnabled(false);                                            // 設(shè)置按鈕初始值值為false狀態(tài),即不可用
    connect(tcpServer,&QTcpServer::newConnection,this,&Server::tcpServer_connect);//將newConnection信號與槽函數(shù)連接起來
}

槽函數(shù)

//發(fā)送數(shù)據(jù)槽函數(shù)
void Server::on_sendButton_clicked()
{
    socket->write(ui->sendText->toPlainText().toLocal8Bit());      //通過write函數(shù)發(fā)送數(shù)據(jù)
    socket->flush();
    ui->sendText->clear();
}

//確認(rèn)連接
void Server::tcpServer_connect()
{
    socket=tcpServer->nextPendingConnection();
    QObject::connect(socket,&QTcpSocket::readyRead,this,&Server::read_data);    //當(dāng)接收緩沖區(qū)有信號到來時,產(chǎn)生readyRead信號
    QObject::connect(socket,&QTcpSocket::disconnected,this,&Server::disconnected);//當(dāng)接收到dinconnected信號時,執(zhí)行disconnected函數(shù)
    ui->sendButton->setEnabled(true);          //按鈕設(shè)置為有效
    ui->label->setText(tr("連接成功!"));
}

//讀取客戶端發(fā)送的數(shù)據(jù)
void Server::read_data()
{
    QByteArray buffer=socket->readAll();           //讀取的數(shù)據(jù)放入QByteArray對象中
    ui->recText->append(QString::fromLocal8Bit(buffer));       //將數(shù)據(jù)顯示出來
}

void Server::disconnected()
{
    ui->sendButton->setEnabled(false);        //斷開連接后按鈕值設(shè)置為無效
}

(2)客戶端設(shè)計

1、建立一個工程,工程名為tcpclient,類名為client。在.pro文件中加入如下代碼并保存。

QT       += network

2、進(jìn)入client.h,添加類的前置聲明

class QTcpSocket;     //QTcpSocket類的前置聲明

定義一個套接字對象指針

QTcpSocket *tcpSocket;       //定義一個套接字對象指針

添加私有槽函數(shù)聲明

 void readData();                 //讀取函數(shù)
 void discon();                   //斷開連接
 void on_connectButton_clicked(); //連接按鈕槽函數(shù)
 void on_sendButton_clicked();    //發(fā)送按鈕槽函數(shù)

3、轉(zhuǎn)到client.cpp,

添加頭文件#include,并編寫構(gòu)造函數(shù)

Client::Client(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket(this);          //定義套接字對象

    //關(guān)聯(lián)信號到自定義的槽上
    QObject::connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readData);          //有接收數(shù)據(jù)時,執(zhí)行讀函數(shù)
    QObject::connect(tcpSocket,&QTcpSocket::disconnected,this,&Client::discon);
    ui->sendButton->setEnabled(false);
}

槽函數(shù)

void Client::discon()
{
    ui->sendButton->setEnabled(false);
    ui->connectButton->setText(tr("取消連接"));

}

//點擊連接按鈕,開始創(chuàng)建連接
void Client::on_connectButton_clicked()
{
    if(ui->connectButton->text()==tr("連接"))
    {
        tcpSocket->abort();
        tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());//連接到指定主機(jī)的端口
        if(!tcpSocket->waitForConnected(30000))                                             //超時連接失敗
        {
            qDebug()<<"Connection failed!";
            return;
        }
        qDebug()<<"Connection successfully!";
        ui->connectButton->setText("取消連接");
        ui->sendButton->setEnabled(true);
    }
    else
    {
        tcpSocket->disconnectFromHost();
        ui->connectButton->setText("連接");
        ui->sendButton->setEnabled(false);
    }
}

//點擊發(fā)送數(shù)據(jù)
void Client::on_sendButton_clicked()
{
    QString sendData=ui->sendText->toPlainText();                                           //發(fā)送數(shù)據(jù)為文本框的的內(nèi)容
    tcpSocket->write(sendData.toLocal8Bit());
    tcpSocket->flush();
    ui->sendText->clear();
}

關(guān)于“基于Qt的TCP怎么實現(xiàn)通信”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“基于Qt的TCP怎么實現(xiàn)通信”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI