QT之TCP/IP通信---服務端

項目需求:使用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. 實現發送功能(server.cpp)

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

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

    //B. 將數據寫入通信套接字
    tcpSocket->write(str.toUtf8().data());
}

9. 實現斷開連接功能(server.cpp)

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

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

}

下一篇實現客戶端。

本文原創,轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章