既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
{
ui->setupUi(this);
//QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
clientudp=new QUdpSocket(this);
clientudp->bind(6000,QUdpSocket::ShareAddress);//绑定读数据端口(监听端口),允许其他服务绑定到此端口
connect(clientudp,SIGNAL(readyRead()),this,SLOT(recv()));
}
UdpClient::~UdpClient()
{
delete ui;
}
void UdpClient::on_pushButton_clicked()
{
// QHostAddress serverip;
// serverip.setAddress(QString("192.168.0.7"));//这是人为指定ip地址的方法
clientudp->writeDatagram(QVariant(ui->textEdit_write->toPlainText()).toByteArray(),QHostAddress::LocalHost,5000);//向5000端口写数据
}
void UdpClient::recv()
{
while(clientudp->hasPendingDatagrams())
{
QByteArray data;
data.resize(clientudp->pendingDatagramSize());
clientudp->readDatagram(data.data(),data.size());
ui->textEdit_show->setText(QVariant(data).toString());
}
}
//注意,监听与发送的端口可以相同也可以不同,它们相对独立,就像有名管道
服务端代码:
udpserver.cpp
#include "udpserver.h"
#include "ui_udpserver.h"
#include <QVariant>
UdpServer::UdpServer(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::UdpServer)
{
ui->setupUi(this);
serverudp=new QUdpSocket(this);
serverudp->bind(5000,QUdpSocket::ShareAddress);//绑定读数据端口(监听端口),允许其他服务绑定到此端口
connect(serverudp,SIGNAL(readyRead()),this,SLOT(recv()));
}
UdpServer::~UdpServer()
{
delete ui;
}
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中的代码
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
09745)]
源文件qudpapp.cpp中的代码
[外链图片转存中…(img-PWiKS1zh-1715901409745)]
[外链图片转存中…(img-EQRept55-1715901409745)]
[外链图片转存中…(img-XOSZCydc-1715901409745)]
[外链图片转存中…(img-g0z7LL7k-1715901409746)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)