網(wǎng)站首頁 編程語言 正文
Qt簡單實(shí)現(xiàn)UDP通信的具體代碼,供大家參考,具體內(nèi)容如下
標(biāo)簽(空格分隔): udp通信、Qt
一、UDP簡介
1)UDP(User Datagram Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)
UDP是一個(gè)輕量級、不可靠、面向數(shù)據(jù)報(bào)的、無連接的傳輸層協(xié)議,多用于可靠性要求不嚴(yán)格,不是非常重要的傳輸,如直播、視頻會議等等。
2)Qt中QUdpSocket類繼承自QAbstractSocket,用來發(fā)送和接收UDP數(shù)據(jù)報(bào),”Socket”即套接字,套接字即IP地址+端口號。其中IP地址指定了網(wǎng)絡(luò)中的一臺主機(jī),二端口號則指定了該主機(jī)上的一個(gè)應(yīng)用程序,端口號只具有本地意義,使用套接字即可實(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é)。端口號選擇1024-65535(1024以下的常用作保留端口號,如FTP常用端口號21,Telnet常用端口號23,DNS域名服務(wù)器常用端口53等)。
二、具體Demo
發(fā)送端:
- 新建Qt Widgets Application,用作udp發(fā)送端,繼承自Qwidget類即可,設(shè)計(jì)ui界面,用于發(fā)送信息,界面如下:
- 打開pro文件,做如下修改,支持網(wǎng)絡(luò)編程,接收端也需做如下修改
- 添加發(fā)送端udpSocket以及按鈕的點(diǎn)擊信號
#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)擊信號
private:
? ? Ui::Widget *ui;
? ? QUdpSocket* m_sender; ? //udp發(fā)送端
};
#endif // WIDGET_H
- 點(diǎn)擊信號對應(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)簽部件來顯示接收到的信息,界面如下:
- 跟發(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í),就會發(fā)送readRead信號
? ? 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é)果如下:
原文鏈接:https://blog.csdn.net/qq_43686329/article/details/120352026
相關(guān)推薦
- 2022-07-19 Redis中pop出隊(duì)列多個(gè)元素思考_實(shí)用技巧
- 2022-11-26 詳解vant2?自動(dòng)檢查表單驗(yàn)證?-validate_React
- 2022-03-29 ASP.NET?Core實(shí)現(xiàn)動(dòng)態(tài)獲取文件并下載_實(shí)用技巧
- 2022-05-10 原生ajax 在服務(wù)器響應(yīng)前撤銷請求
- 2022-10-05 python?slack桌面自動(dòng)化開發(fā)工具_(dá)python
- 2022-03-18 C語言計(jì)算字符串最后一個(gè)單詞的長度_C 語言
- 2022-09-03 Python?groupby函數(shù)圖文詳解_python
- 2022-11-19 GoLang中的iface?和?eface?的區(qū)別解析_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支