1. 程式人生 > 其它 >Day04_TCP程式設計_UDP程式設計_UDP傳輸圖_多執行緒程式設計(多工):4.28晚上-4.29

Day04_TCP程式設計_UDP程式設計_UDP傳輸圖_多執行緒程式設計(多工):4.28晚上-4.29

4 Day04_TCP程式設計_UDP程式設計_UDP傳輸圖_多執行緒程式設計(多工)

  • 4.1 QT下的TCP通訊
  • 4.1.2 如需要到網路程式設計則需要在專案檔案上加QT += network

4.2 伺服器:

  • 4.2.1 只讀屬性的設定:QTextEdit的readOnly

  • 4.2.2 加了專案檔案後需要點選小錘子進行編譯不執行,專案檔案的作用是:所包含的檔案中在改專案檔案中需要,專案檔案規劃了各種不同的檔案;

  • 4.2.3 程式碼:

  • widget.cpp

    #include "serveltwidget.h"
    #include "ui_serveltwidget.h"
    
    ServeltWidget::ServeltWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::ServeltWidget)
    {
        ui->setupUi(this);
        //第一步:先建立監聽套接字,因為我們用的指標,所需要動態分配空間;
        //this是指定父物件,讓她自動回收空間
        tcpServer = new QTcpServer(this);
        //第二步監聽埠:綁定當前網絡卡的所有的IP地址,埠號
        tcpServer->listen(QHostAddress::Any,8888);
         //第二步監聽埠:綁定當前網絡卡的所有的IP地址,埠號
        tcpServer->listen(QHostAddress::Any,8888);
        //第三步取出建立好連結的套接字,客戶端跟伺服器端產生連結後,會產生一個訊號
        connect(tcpServer,&QTcpServer::newConnection,
                [=]()
                {
                    //取出建立好連結的套接字;取出的直接是一個指標,不需要動態分配空間;
                    tcpSocket = tcpServer->nextPendingConnection();
                    //顯示在我當前的對話方塊與哪一個IP和埠號連結;
                    //獲取對方的IP和埠
                    QString ip = tcpSocket->peerAddress().toString();
                    qint16 port = tcpSocket->peerPort();
    
                    //給顯示的資訊組一個框
                    QString temp = QString("[%1:%2]:成功連結").arg(ip).arg(port);
                    ui->tE_read->setText(temp);
                }
                );
    
    }
    
    ServeltWidget::~ServeltWidget()
    {
        delete ui;
    }
    
  • widget.h

    #ifndef SERVELTWIDGET_H
    #define SERVELTWIDGET_H
    #include <QWidget>
    #include <QTcpServer>//監聽套接字
    #include <QTcpSocket>//通訊套接字
    //在伺服器端需要兩個套接字。客戶端只需要一個;
    namespace Ui {
    class ServeltWidget;
    }
    class ServeltWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit ServeltWidget(QWidget *parent = 0);
        ~ServeltWidget();
    private:
        Ui::ServeltWidget *ui;
        //指標需要分配動態空間;
        QTcpServer *tcpServer;//監聽套接字物件
        QTcpSocket *tcpSocket;//通訊套接字
    };
    #endif // SERVELTWIDGET_H
    
  • pro檔案

    QT       += core gui network
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    TARGET = 04_TCP
    TEMPLATE = app
    DEFINES += QT_DEPRECATED_WARNINGS
    
    SOURCES += \
            main.cpp \
            serveltwidget.cpp
    
    HEADERS += \
            serveltwidget.h
    
    FORMS += \
            serveltwidget.ui
    
    CONFIG += C++11
    
  • 4.3 伺服器端功能send的實現

  • 在UI介面點選send,然後轉到槽,對訊號進行處理;

  • 程式碼:

    void ServeltWidget::on_pButton_send_clicked()
    {
        //獲取編輯器內容
        QString str = ui->tE_write->toPlainText();
        //給對方傳送資料,使用套接字tcpSocket
        tcpSocket->write(str.toUtf8().data());
        
    }
    
  • 4.4 伺服器功能close的實現

    • 按鈕轉為槽
  • 程式碼:

    void ServeltWidget::on_pButton_close_clicked()
    {
        //按下按鈕是斷開連結,是主動和客戶端斷開連結;
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
    }
    
    
  • 4.5 客戶端功能

  • 客戶端功能只有一個通訊套接字,沒有監聽套接字

  • 可以不重新開一個專案,可以都在伺服器那個專案裡面寫

  • 右擊選擇“選擇新檔案”----QT----Qt設計師介面類(帶UI的介面)--下一步--Widget--下一步--編寫類名--下一步--完成。

  • 程式碼:

    #include "clientwidget.h"
    #include "ui_clientwidget.h"
    #include <QHostAddress>
    ClientWidget::ClientWidget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::ClientWidget)
    {
        ui->setupUi(this);
        tcpSocket = NULL;
        //分配動態空間,指定父物件
        tcpSocket = new QTcpSocket(this);
        //標題
        setWindowTitle("客戶端");
        //如果成功和伺服器連結好後,會自動觸發connect槽函式,會自動進入執行這個;
        connect(tcpSocket,&QTcpSocket::connected,
                [=]()
                {
                    ui->textEdit_read->setText("成功和伺服器建立好連結");
                }
                );
        //接收資料
        connect(tcpSocket,&QTcpSocket::readyRead,
                [=]()
                {
                    //獲取對方傳送的內容
                    QByteArray array = tcpSocket->readAll();
                    //追加到編輯區中
                    ui->textEdit_read->append(array);
                }
                );
    }
    ClientWidget::~ClientWidget()
    {
        delete ui;
    }
    void ClientWidget::on_pushButton_connect_clicked()
    {
        //獲取伺服器埠和IP
        QString ip = ui->lineEdit_IP->text();
        qint16 port = ui->lineEdit_port->text().toInt();
    
        //主動和伺服器建立連結
        tcpSocket->connectToHost(QHostAddress(ip),port);
    }
    void ClientWidget::on_pushButton_send_clicked()
    {
        //傳送資料
        //獲取編輯框的內容
       QString str = ui->textEdit_write->toPlainText();
       //傳送內容
       tcpSocket->write( str.toUtf8().data() );
    }
    void ClientWidget::on_pushButton_close_clicked()
    {
        //close連結
        //主動和對方斷開連結
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
    }
    
  • clientwidget.h

    #ifndef CLIENTWIDGET_H
    #define CLIENTWIDGET_H
    #include <QWidget>
    #include <QTcpSocket>//通訊套接字
    namespace Ui {
    class ClientWidget;
    }
    class ClientWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit ClientWidget(QWidget *parent = 0);
        ~ClientWidget();
    private slots:
        void on_pushButton_connect_clicked();
        void on_pushButton_send_clicked();
        void on_pushButton_close_clicked();
    private:
        Ui::ClientWidget *ui;
        QTcpSocket *tcpSocket;
    };
    #endif // CLIENTWIDGET_H
    

5 UDP下通訊

5.1UDP通訊原理

  • TCP:打電話

  • UDP:寫信

  • Linux原理圖:

  • QT下的UDP通訊原理圖:

5.2UDP傳送文字