收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
void UdpServer::recv()
{
while(serverudp->hasPendingDatagrams())
{
QByteArray data;
data.resize(serverudp->pendingDatagramSize());
serverudp->readDatagram(data.data(),data.size());//
ui->textEdit_show->clear();
ui->textEdit_show->setText(QVariant(data).toString());
}
}
void UdpServer::on_pushButton_clicked()
{
// QHostAddress serverip;
// serverip.setAddress(QString("192.168.0.7"));//这是人为指定ip地址的方法
serverudp->writeDatagram(QVariant(ui->textEdit_write->toPlainText()).toByteArray(),QHostAddress::LocalHost,6000);//向6000端口写数据
}
//注意,监听与发送的端口可以相同也可以不同,它们相对独立,就像有名管道
执行结果:
代码下载链接:
--------------------- 本文来自 小明37 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/we1583004we/article/details/79188305?utm_source=copy
这里说明一下,UDP通信中分为三种通信分别为单播、组播和广播,下面将一一为大家介绍。
同样的我们都需要在工程文件中添加network
QT += core gui network
进行UDP通信需要用到的头文件
#include <QUdpSocket>
这里我们把UDP通信分为两个部分写,一个是发送端,另一个是接收端,而发送端中又分为单播、组播和广播三种形式,下面我们先来看看写发送端的代码程序的步骤:
发送端Udpsend的代码:
1、单播
(1)创建套接字
QUdpSocket mSocket;
mSocket = new QUdpSocket();
(2)发送数据到指定的地址和端口号
mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("192.168.137.1"),6677);
参数:ui->textEdit->toPlainText().toUtf8 要发送的消息
QHostAddress("192.168.137.1") 接收端的ip地址
6677 端口号,要和接收端的一致
2、组播,组播和单播的步骤是一样的,只有ip地址处有区别
组播ip地址范围:224.0.0.0-239.255.255.255
例子:mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("224.0.0.100"),6677);
3、广播,广播也只有ip地址和单播有区别
广播地址ip:QHostAddress::Broadcast
例子:mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress::Broadcast,6677);
好了,单播、组播和广播的区别应该都了解了,那么我们就来看发送端(udpsend.cpp)的具体代码:
1 #include "udpsend.h"
2 #include "ui_udpsend.h"
3
4 UdpSend:: UdpSend(QWidget *parent) :
5 QMainWindow(parent),
6 ui(new Ui:: UdpSend)
7 {
8 ui->setupUi(this);
9
10 //初始化创建QUdpSocket对象
11 mSocket = new QUdpSocket();
12 }
13
14 UdpSend::~ UdpSend()
15 {
16 delete ui;
17 }
18
19 void UdpSend::on_sendBt_clicked()
20 {
21 //单播
22 // qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("192.168.137.1"),6677);
23
24
25 //组播ip地址范围:224.0.0.0-239.255.255.255
26 //qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress("224.0.0.100"),6677);
27
28 //广播
29 qint64 len = mSocket->writeDatagram(ui->textEdit->toPlainText().toUtf8(),QHostAddress::Broadcast,6677);
30
31
32 }
发送端的界面文件我做的很简单,我只做了发送消息框:
看完发送端的代码,我们继续来看接收端的代码(Udprecv)
接收端不管是单播、或者组播还是广播代码都是一样的,下面是写接收端代码的步骤:
1、创建套接字
QUdpSocket mSocket;
mSocket = new QUdpSocket();
2、绑定地址和端口号
mSocket->bind(QHostAddress::AnyIPv4,6677);
参数:AnyIPv4 IPv4
6677 端口号,要和发送端的一致
3、等待数据的到来,利用readyRread()
connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_data()));
4、读数据
readDatagram(char * data, qint64 maxSize, QHostAddress * address = 0, quint16 * port = 0)
参数:
data:数据
maxSize:数据的大小
address:QHostAddress类型的地址
port:端口号
例子:
void UdpRecv::read_data()
{
QByteArray array;
QHostAddress address;
quint16 port;
array.resize(mSocket->bytesAvailable());//根据可读数据来设置空间大小
mSocket->readDatagram(array.data(),array.size(),&address,&port); //读取数据
ui->listWidget->addItem(array);//显示数据
//发送反馈数据
}
如果是组播的话还涉及到加入组播和退出组播
加入到组播组 joinMulticastGroup
例子:mSocket->joinMulticastGroup(QHostAddress("224.0.0.100"));
退出组播组 leaveMulticastGroup
例子: mSocket->leaveMulticastGroup(QHostAddress("224.0.0.100"));
来看看接收端(Udprecv.cpp)具体实现的代码
1 #include "udprecv.h"
2 #include "ui_udprecv.h"
3
4 UdpRecv::UdpRecv(QWidget *parent) :
5 QMainWindow(parent),
6 ui(new Ui::UdpRecv)
7 {
8 ui->setupUi(this);
9
10 //创建对象 初始化
11 mSocket = new QUdpSocket();
12
13 //绑定
14 mSocket->bind(QHostAddress::AnyIPv4,6677);
15 //关联读数据信号readyread
16 connect(mSocket,SIGNAL(readyRead()),this,SLOT(read_data()));
17
18 }
19
20 UdpRecv::~UdpRecv()
21 {
22 delete ui;
23 }
24
25 void UdpRecv::read_data()
26 {
27 QByteArray array;
28 QHostAddress address;
29 quint16 port;
30 array.resize(mSocket->bytesAvailable());//根据可读数据来设置空间大小
31 mSocket->readDatagram(array.data(),array.size(),&address,&port); //读取数据
32 ui->listWidget->addItem(array);//显示数据
33 //发送反馈数据
34
35 }
36
37 void UdpRecv::on_checkBox_clicked(bool checked)
38 {
39 if(checked)
40 {
41 //加入组播
42 mSocket->joinMulticastGroup(QHostAddress("224.0.0.100"));
43 }
44
45 else
46 {
47 //退出组播
48 mSocket->leaveMulticastGroup(QHostAddress("224.0.0.100"));
49
50 }
51
52 }
接收端的界面文件我只加了显示接收到的信息和选择是否加入组播的选择按钮
这是发送端和接收分开来写的,此外我也实现了一下发送端和接收端写到同一个文件中
头文件qudpapp.h中的代码
1 #ifndef QUDPAPP_H
2 #define QUDPAPP_H
3
4 #include <QWidget>
5 #include <QUdpSocket>
6 namespace Ui {
7 class QUdpApp;
8 }
9
10 class QUdpApp : public QWidget
11 {
12 Q_OBJECT
13
14 public:
15 explicit QUdpApp(QWidget *parent = 0);
16 ~QUdpApp();
17
18 private slots:
19 void on_sendSigRb_clicked(); //单播旋转轴
20 void on_sendMulRb_clicked(); //组播选择
21 void on_sendBroadRb_clicked(); //广播选择
22 void on_sendBt_clicked(); //发送按钮
23
24 //===========================================
25 void on_recvCb_clicked(bool checked); //选择接收
26 void on_recvJoinMulBt_clicked(); //加入组播
27 void on_recvLeaveMulBt_clicked(); //退出组播
28
29 void on_sendMesEdit_cursorPositionChanged();//检测消息框是否有数据
30 void read_data();
31
32 private:
33 Ui::QUdpApp *ui;
34 QUdpSocket *mSocket;
35 QHostAddress sendaddrees;
36 QString sendPort;
37
38 };
39
40 #endif // QUDPAPP_H
源文件qudpapp.cpp中的代码
1 #include "qudpapp.h"
2 #include "ui_qudpapp.h"
3 #include <QMessageBox>
4 QUdpApp::QUdpApp(QWidget *parent) :
5 QWidget(parent),
6 ui(new Ui::QUdpApp)
7 {
8 ui->setupUi(this);
9 mSocket = new QUdpSocket();//创建套接字
10 ui->sendBt->setEnabled(false);
11 }
12
13 QUdpApp::~QUdpApp()
14 {
15 delete ui;
16 }
17
18
19 //==========================发送端====================
20 //单播选择
21 void QUdpApp::on_sendSigRb_clicked()
22 {
23 if(ui->sendPortEdit->text().isEmpty() || ui->sendSigAddrEdit->text().isEmpty())
24 {
25 QMessageBox::warning(this,"提示","请输入单播ip和端口号");
26 //ui->sendSigRb->setChecked(false);
27 return;
28 }
29 sendaddrees.setAddress( ui->sendSigAddrEdit->text());
30 sendPort = ui->sendPortEdit->text();
31
32 }
33
34 //组播选择
35 void QUdpApp::on_sendMulRb_clicked()
36 {
37 if(ui->sendPortEdit->text().isEmpty() || ui->sendMulAddrEdit->text().isEmpty())
38 {
39 QMessageBox::warning(this,"提示","请输入组播ip和端口号");
40 //ui->sendSigRb->setChecked(false);
41 return;
42 }
43 sendaddrees.setAddress( ui->sendMulAddrEdit->text());
44 sendPort = ui->sendPortEdit->text();
45
46 }
47
48 //广播选择
49 void QUdpApp::on_sendBroadRb_clicked()
50 {
51 if(ui->sendPortEdit->text().isEmpty() || ui->sendBroadAddrEdit->text().isEmpty())
52 {
53 QMessageBox::warning(this,"提示","请输入广播ip和端口号");
54 //ui->sendSigRb->setChecked(false);
55 return;
56 }
57 sendaddrees.setAddress( ui->sendBroadAddrEdit->text());
58 sendPort = ui->sendPortEdit->text();
59
60 }
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/18622ffb6facbad9ec0d569548c1feae.png)
![img](https://img-blog.csdnimg.cn/img_convert/e9f4ab967387dcb3a8c899a8817a74b6.png)
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
.setAddress( ui->sendBroadAddrEdit->text());
58 sendPort = ui->sendPortEdit->text();
59
60 }
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
[外链图片转存中...(img-ZMSRUl2W-1715901375765)]
[外链图片转存中...(img-KlmYb5JX-1715901375765)]
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**