Day04_TCP程式設計_UDP程式設計_UDP傳輸圖_多執行緒程式設計(多工):4.28晚上-4.29
阿新 • • 發佈:2022-05-16
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通訊原理圖: