Qt實(shí)現(xiàn)簡(jiǎn)單UDP通信
Qt簡(jiǎn)單實(shí)現(xiàn)UDP通信的具體代碼,供大家參考,具體內(nèi)容如下
標(biāo)簽(空格分隔): udp通信、Qt
一、UDP簡(jiǎn)介
1)UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)
UDP是一個(gè)輕量級(jí)、不可靠、面向數(shù)據(jù)報(bào)的、無(wú)連接的傳輸層協(xié)議,多用于可靠性要求不嚴(yán)格,不是非常重要的傳輸,如直播、視頻會(huì)議等等。
2)Qt中QUdpSocket類繼承自QAbstractSocket,用來(lái)發(fā)送和接收UDP數(shù)據(jù)報(bào),”Socket”即套接字,套接字即IP地址+端口號(hào)。其中IP地址指定了網(wǎng)絡(luò)中的一臺(tái)主機(jī),二端口號(hào)則指定了該主機(jī)上的一個(gè)應(yīng)用程序,端口號(hào)只具有本地意義,使用套接字即可實(shí)現(xiàn)網(wǎng)絡(luò)上的兩個(gè)應(yīng)用程序之間的通信。
3)QUdpSocket支持IPv4廣播,要廣播數(shù)據(jù)報(bào),則只需發(fā)送到一個(gè)特殊的地址QHostAddress::Broadcast(即255.255.255.255),數(shù)據(jù)報(bào)一般建議發(fā)送字節(jié)數(shù)小于512字節(jié)。端口號(hào)選擇1024-65535(1024以下的常用作保留端口號(hào),如FTP常用端口號(hào)21,Telnet常用端口號(hào)23,DNS域名服務(wù)器常用端口53等)。
二、具體Demo
發(fā)送端:
- 新建Qt Widgets Application,用作udp發(fā)送端,繼承自Qwidget類即可,設(shè)計(jì)ui界面,用于發(fā)送信息,界面如下:
- 打開pro文件,做如下修改,支持網(wǎng)絡(luò)編程,接收端也需做如下修改
- 添加發(fā)送端udpSocket以及按鈕的點(diǎn)擊信號(hào)
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QUdpSocket> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { ? ? Q_OBJECT public: ? ? Widget(QWidget *parent = nullptr); ? ? ~Widget(); private slots: ? ? void on_pushButton_clicked(); ? //按鈕點(diǎn)擊信號(hào) private: ? ? Ui::Widget *ui; ? ? QUdpSocket* m_sender; ? //udp發(fā)送端 }; #endif // WIDGET_H
- 點(diǎn)擊信號(hào)對(duì)應(yīng)槽函數(shù)的實(shí)現(xiàn):
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) ? ? : QWidget(parent) ? ? , ui(new Ui::Widget) { ? ? ui->setupUi(this); ? ? m_sender=new QUdpSocket(this); } Widget::~Widget() { ? ? delete ui; } void Widget::on_pushButton_clicked() { ? ? QByteArray dataGram=ui->lineEdit->text().toUtf8(); ? ? m_sender->writeDatagram(dataGram.data(), ? ? ? ? ? ? ? ? ? ? ? ? ? ? dataGram.size(), ? ? ? ? ? ? ? ? ? ? ? ? ? ? QHostAddress::Broadcast, ? ?//udp廣播地址 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 6666); }
接受端:
- 再新建Qt Widgets Application項(xiàng)目,用作udp接收端,繼承自Qwidget類即可,設(shè)計(jì)ui界面,用標(biāo)簽部件來(lái)顯示接收到的信息,界面如下:
- 跟發(fā)送端一樣,在pro文件中添加支持網(wǎng)絡(luò)編程的模塊 network
- 添加接收端udpSocket,如下:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QUdpSocket> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { ? ? Q_OBJECT public: ? ? Widget(QWidget *parent = nullptr); ? ? ~Widget(); private slots: ? ? void processData(); private: ? ? Ui::Widget *ui; ? ? QUdpSocket* m_receiver; //udp接受端 }; #endif // WIDGET_H
- 編輯接收端源文件:
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) ? ? : QWidget(parent) ? ? , ui(new Ui::Widget) { ? ? ui->setupUi(this); ? ? m_receiver=new QUdpSocket(this); ? ? //綁定發(fā)送端,ShareAddress允許多接收端綁定6666端口 ? ? m_receiver->bind(6666,QUdpSocket::ShareAddress); ? ? //當(dāng)接收端接收到數(shù)據(jù)時(shí),就會(huì)發(fā)送readRead信號(hào) ? ? connect(m_receiver,&QUdpSocket::readyRead,this,&Widget::processData); } Widget::~Widget() { ? ? delete ui; } void Widget::processData() { ? ? QString strData; ? ? //有未處理的數(shù)據(jù)報(bào) ? ? while(m_receiver->hasPendingDatagrams()){ ? ? ? ? QByteArray dataGram; ? ? ? ? //讀取的數(shù)據(jù)報(bào)大小 ? ? ? ? dataGram.resize(m_receiver->pendingDatagramSize()); ? ? ? ? m_receiver->readDatagram(dataGram.data(),dataGram.size()); ? ? ? ? ui->dataLabel->setText(dataGram); ? //將接收到的數(shù)據(jù)顯示到標(biāo)簽上 ? ? } }
三、運(yùn)行效果
- 運(yùn)行發(fā)送端應(yīng)用程序,再打開接收端應(yīng)用程序;
- 在發(fā)送端編輯框輸入數(shù)據(jù),點(diǎn)擊廣播,觀察接收端的情況,結(jié)果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Qt實(shí)現(xiàn)簡(jiǎn)單的TCP通信
- QT編寫tcp通信工具(Client篇)
- QT編寫tcp通信工具(Server端)
- QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解
- Qt?TCP網(wǎng)絡(luò)通信學(xué)習(xí)
- Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信
- QT5實(shí)現(xiàn)簡(jiǎn)單的TCP通信的實(shí)現(xiàn)
- 基于QT的TCP通信服務(wù)的實(shí)現(xiàn)
- QT5實(shí)現(xiàn)UDP通信的示例代碼
- QT串口通信的實(shí)現(xiàn)方法
- Qt實(shí)現(xiàn)進(jìn)程間通信
相關(guān)文章
C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的SOAP客戶端
這篇文章主要介紹了C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的SOAP客戶端,在C++中,一般使用gSOAP來(lái)實(shí)現(xiàn)客戶端、服務(wù)端,下面一起進(jìn)入文章了解具體內(nèi)容,需要的朋友可以參考一下2021-11-11C語(yǔ)言動(dòng)態(tài)內(nèi)存管理分析總結(jié)
C語(yǔ)言中開辟內(nèi)存有很多種方式,目前我們最常用的也就是數(shù)組,但數(shù)組是在我們用到他之前就得設(shè)定好它的長(zhǎng)度,有時(shí)很不方便。隨意我們來(lái)探究動(dòng)態(tài)內(nèi)存管理2021-11-11C語(yǔ)言自定義函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了C語(yǔ)言自定義函數(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01C++簡(jiǎn)明圖解分析靜態(tài)成員與單例設(shè)計(jì)模式
與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對(duì)象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對(duì)象,也就無(wú)法對(duì)一個(gè)對(duì)象中的非靜態(tài)成員進(jìn)行默認(rèn)訪問2022-06-06C++的static關(guān)鍵字及變量存儲(chǔ)位置總結(jié)
今天看博文時(shí),看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲(chǔ)位置;接下來(lái)為您詳細(xì)呈現(xiàn)2012-11-11