- QUdpSocket類提供一個UDP套接字。
- UDP(用戶數據報協議)是一種輕量級、不可靠、面向數據報、無鏈接的協議。它能夠在可靠性不重要的狀況下使用。QUdpSocket是QAbstractSocket的一個子類,容許您發送和接收UDP數據報。
- 注意:使用時須要在pro文件中添加network組件
QT += network
.hc++
#ifndef SENDWIDGET_H #define SENDWIDGET_H #include "QPushButton" #include "QLineEdit" #include <QWidget> #include <QUdpSocket> class SendWIdget : public QWidget { Q_OBJECT public: explicit SendWIdget(QWidget *parent = nullptr); ~SendWIdget(); private slots: void slo_sendMessge(); private: void init(); private: QLineEdit * edit; QPushButton * btn; QUdpSocket * sender; }; #endif // SENDWIDGET_H
.cppapp
#include "SendWIdget.h" #include <QHBoxLayout> #include <QTextCodec> SendWIdget::SendWIdget(QWidget *parent) : QWidget(parent) { // 初始化 init(); // 關聯發送按鈕的點擊信號 connect(btn,&QPushButton::clicked,this,&SendWIdget::slo_sendMessge); } SendWIdget::~SendWIdget() { delete edit; delete btn; delete sender; } void SendWIdget::slo_sendMessge() { // 獲取輸入框的內容 QString string(edit->text()); qDebug() << string; /*發送數據 * 第一個參數:要發送的內容,這裏是要發送輸入框的內容, * 參數沒有QString類型,須要轉換爲QByteArray類型或Char*類型 * 第二個參數:要發送到的目標IP地址,這裏是本機測試,因此用LocalHost * 第三個參數:要發送的的目標端口,本身隨意指定 * 返回值:發送成功返回發送的字節數,失敗返回-1 */ int w = sender->writeDatagram(string.toLocal8Bit(),QHostAddress::LocalHost,8179); // 判斷是否發送成功 if(w == -1) { qDebug() << "發送失敗!"; } else { qDebug() << "發送成功,字節數:" << w; } } /* * 初始化界面和通訊套接字 */ void SendWIdget::init() { edit = new QLineEdit; btn = new QPushButton("發送"); // 建立水平佈局 QHBoxLayout * layout = new QHBoxLayout(this); // 將行文本框添加到水平佈局中 layout->addWidget(edit); // 將發送按鈕添加到水平佈局 layout->addWidget(btn); // 初始化UDP套接字 sender = new QUdpSocket(this); }
mainsocket
#include "widget.h" #include "SendWIdget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); SendWIdget s; s.setWindowTitle("send"); s.show(); return a.exec(); }
.h函數
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPlainTextEdit> #include <QUdpSocket> class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private slots: void slo_receiveMeaage(); private: QPlainTextEdit * showMessage; QUdpSocket * receiver; }; #endif // WIDGET_H
.cpp佈局
#include "widget.h" #include <QDebug> #include <QTextCodec> Widget::Widget(QWidget *parent) : QWidget(parent) { // 建立顯示消息的文本框 showMessage = new QPlainTextEdit(this); // 設置文本框只讀 showMessage->setReadOnly(true); // 設置文本框初始大小 showMessage->resize(300,200); // 建立UDP套接字 receiver = new QUdpSocket(this); // 綁定接收信息的IP和端口 receiver->bind(QHostAddress::LocalHost,8179); // 關聯readyRead信號(每當有新的數據能夠從設備的當前讀取通道讀取時,這個信號就會發出一次) connect(receiver,&QUdpSocket::readyRead,this,&Widget::slo_receiveMeaage); } Widget::~Widget() { delete showMessage; delete receiver; } void Widget::slo_receiveMeaage() { // 用於存儲接收到的數據 QByteArray message; // 循環讀取接收的數據,若是至少有一個數據報等待讀取,些函數返回 true,不然返回 false。 while (receiver->hasPendingDatagrams()) { // 動態設置大小爲第一個掛起的 udp 數據包的大小 message.resize(receiver->pendingDatagramSize()); /* 接收數據 * 第一個參數:存儲接收到數據 * 第二個參數:接收的數據最大的大小 * 返回值:成功返回接收的數據字節數,失敗返回-1 */ int r = receiver->readDatagram(message.data(),message.size()); // 判斷是否接收成功 if(r == -1) { qDebug() << "接收數據失敗"; } else { qDebug() << "接收數據成功"; } } //指定編碼方式,不然若是數據中出現中文,會出現亂碼狀況 QTextCodec *codec = QTextCodec::codecForName("GBK"); QString string = codec->toUnicode(message); qDebug() << string; // 將編碼後的數據顯示到文本框中 showMessage->appendPlainText(string); }
main測試
#include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); }