1. 程式人生 > >QT之TCP通訊---服務端

QT之TCP通訊---服務端

專案需求:使用QT的TCP實現客戶端與服務端的通訊,介面如下

寫在開頭:幾個重要的方法與訊號

//監聽方法,監聽本機所有IP的9999埠
tcpServer->listen(QHostAddress::Any, 9999);    

//當新連線建立時觸發該訊號
&QTcpServer::newConnection    

//A. 取出tcpSocket套接字
tcpSocket = tcpServer->nextPendingConnection();

//B. 取出套接字中的IP資訊
QString ip = tcpSocket->peerAddress().toString();
qint16 port = tcpSocket->peerPort();

//收到對方發來的資料的時候觸發該訊號
&QTcpSocket::readyRead

//將資料寫入通訊套接字
tcpSocket->write(str.toUtf8().data());


//斷開與客戶端的連線
tcpSocket->disconnectFromHost();
tcpSocket->close();

服務端的實現

1.  引用網路模組到QT中( .pro檔案)

QT += network   #1. 引用網路模組
2. 引用套接字標頭檔案(server.h)
//2. 引用標頭檔案
#include <QTcpServer>   //監聽套接字
#include <QTcpSocket>   //通訊套接字
#include <QHostAddress>

3.  建立套接字物件(server.h)

private:
    Ui::ServerWidget *ui;

    //3. 建立物件
    QTcpServer *tcpServer;  //監聽套接字
    QTcpSocket *tcpSocket;  //通訊套接字

4.  給物件分配空間(server.cpp)

    //4. 給物件分配空間
    tcpServer = new QTcpServer(this);   //監聽套接字

5.  引用Lamda表示式模組(.pro)

CONFIG += C++11     #5. 需要使用Lamda表示式

6. 監聽埠(server.cpp)

    //6. 服務端監聽本機的所有IP中的9999埠
    tcpServer->listen(QHostAddress::Any, 9999);

7.  取出套接字中的資訊(server.cpp)

    //7. 取出tcpSocket中的資訊
    connect(tcpServer, &QTcpServer::newConnection,
            [=]()
            {
                //A. 取出tcpSocket套接字
                tcpSocket = tcpServer->nextPendingConnection();

                //B. 取出套接字中的IP資訊
                QString ip = tcpSocket->peerAddress().toString();
                qint16 port = tcpSocket->peerPort();

                //C. 拼接顯示資訊
                QString temp = QString("[%1:%2]:Connect Success!").arg(ip).arg(port);
                ui->textEditReceive->setText(temp);

                //D. 接受資料
                connect(tcpSocket, &QTcpSocket::readyRead,
                        [=]()
                        {
                            //讀取通訊套接字中的所有資料
                            QByteArray array = tcpSocket->readAll();
                            //顯示到UI中
                            ui->textEditReceive->append(array);
                        }
                        );

            }
            );

8. 實現傳送功能

//當傳送按鈕被點選的時候,傳送內容到客戶端
void ServerWidget::on_buttonSend_clicked()
{
    if(tcpSocket == NULL)
    {
        return;
    }

    //A. 獲取文字框的內容
    QString str = ui->textEditSend->toPlainText();

    //B. 將資料寫入通訊套接字
    tcpSocket->write(str.toUtf8().data());
}

9. 實現斷開連線功能

//當點選關閉的時候,斷開與客戶端的連線
void ServerWidget::on_buttonClose_clicked()
{
    if(tcpSocket == NULL)
    {
        return;
    }

    tcpSocket->disconnectFromHost();
    tcpSocket->close();
    tcpSocket = NULL;
    ui->textEditReceive->append("與客戶端連線已斷開");

}

下一篇實現客戶端。