天天看點

Qt網絡程式:基于TCP的伺服器、用戶端執行個體

首先我們需要設定伺服器:

項目檔案中加入:

QT += network

相關頭檔案:

#include<QTcpServer>//監聽套接字
#include<QTcpSocket>//建立連接配接的通信套接字
           

在頭檔案中,定義套接字:

QTcpServer *tcpServer;//監聽套接字
    QTcpSocket *tcpSocket;//通信套接字
           

随後,在cpp檔案中初始化:

//初始化套接字
    tcpServer = NULL;
    tcpSocket = NULL;
    //監聽套接字,指定父對象自動回收空間
    tcpServer = new QTcpServer(this);
    //設定端口
    tcpServer->listen(QHostAddress::Any,);
           

當新連接配接建立時,監聽套接字會自動觸發信号:

newConnection

,讀取到資料之後,通信套接字會觸發信号readyRead,是以,我們可以通過信号槽機制進行操作,這裡嵌套了兩個Qt5的Lambda表達式:

//新連接配接建立的信号槽
connect(tcpServer,&QTcpServer::newConnection,[=]()
    {
    //取出建立好連接配接的套接字
        tcpSocket = tcpServer->nextPendingConnection();
    //擷取對方的IP和端口
    QString ip = tcpSocket->peerAddress().toString();
    qint16 port = tcpSocket->peerPort();
    //将資訊顯示到UI
    QString temp = QString("[%1:%2]:成功連接配接").arg(ip).arg(port);
    ui->textEditRead->setText(temp);  
     //連接配接建立後,讀取到資料的信号槽
    connect(tcpSocket,&QTcpSocket::readyRead,
            [=]()
            {
             //從通信套接字取出内容
             QByteArray array = tcpSocket->readAll();
             //顯示到UI
             ui->textEditRead->append(array);
            } );
    });
           

用戶端的設定與伺服器類似,隻不過少了一個監聽套接字:

頭檔案中定義套接字:

QTcpSocket * tcpSocket;//通信套接字

cpp檔案初始化套接字:

//初始化套接字
    tcpSocket = NULL;
    //配置設定空間,指定父對象
    tcpSocket = new QTcpSocket(this);
           

信号槽與伺服器類似,這裡的Lambda表達式沒有嵌套:

//擷取伺服器IP和端口
    QString ip = ui->lineEditIP->text();
    qint16 port = ui->lineEditPort->text().toInt();
    //主動連接配接伺服器
    tcpSocket->connectToHost(QHostAddress(ip),port);
 //建立連接配接的信号槽
    connect(tcpSocket,&QTcpSocket::connected,
            [=]()
            {
                 ui->textEditRead->setText("恭喜,成功連接配接伺服器!");
            }
            );
    //連接配接建立後收到伺服器資料的信号槽
    connect(tcpSocket,&QTcpSocket::readyRead,
            [=]()
           {
         //擷取對方發送的内容
        QByteArray array = tcpSocket->readAll();
        //顯示到編輯框
        ui->textEditRead->append(array);//append,添加内容
            } 
//發送資料  
   //擷取編輯框内容
    QString str = ui->textEditWrite->toPlainText();
     //發送資料
     tcpSocket->write( str.toUtf8().data() );
           

關于斷開連接配接:

1、disconnectFromHost()

嘗試關閉套接字。如果有等待寫入的挂起資料,qabstracksocket将進入關閉狀态,并等待所有資料寫入完畢。最終,它将進入未連接配接狀态并發出disconnected()信号。

2、​abort()

中止目前連接配接并重置套接字。與disconnectFromHost ( )不同,此函數會立即關閉套接字,丢棄寫入緩沖區中的所有挂起資料。

3、close()

關閉套接字的I / O裝置,斷開套接字與主機的連接配接,關閉套接字,并重置名稱、位址、端口号和基礎套接字描述符。

效果如圖,連接配接建立後伺服器與用戶端互相發送資料:

Qt網絡程式:基于TCP的伺服器、用戶端執行個體

Demo下載下傳位址:

連結:https://pan.baidu.com/s/12pGsDS-NlKke7a5SlpBqLQ 密碼:eesc

如果閱讀本篇部落格有障礙,可參考網絡程式設計基礎知識:

可以參考https://blog.csdn.net/qq_40194498/article/details/78901089

https://blog.csdn.net/qq_40194498/article/details/78934426