C/C++|Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包
原理以及运行 原理是因为QJsonDocument提供了一个函数toJson
文章图片
可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容,详细的解析过程在如下的连接中!
Qt工作笔记-Qt5 利用QJson从文件读取Json并解析
https://blog.csdn.net/qq78442761/article/details/84761428
【C/C++|Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包】
发送了json数据,用串口调试工具运行截图如下:
文章图片
本例子运行动态图如下:
源码 发送端结构如下:
文章图片
发送端源码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include QT_BEGIN_NAMESPACE
class QUdpSocket;
QT_END_NAMESPACEnamespace Ui {
class Widget;
}class Widget : public QWidget
{
Q_OBJECTpublic:
explicit Widget(QWidget *parent = 0);
~Widget();
protected slots:
void sendMsgToLocal();
private:
Ui::Widget *ui;
QUdpSocket *m_udpSocket;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
#include
#include Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("Sender");
m_udpSocket = new QUdpSocket(this);
connect(ui->sendPushButton, SIGNAL(clicked(bool)), this, SLOT(sendMsgToLocal()));
}Widget::~Widget()
{
delete ui;
}void Widget::sendMsgToLocal()
{
//make a Json data
QJsonObject jsonObject;
jsonObject.insert("Name", "xiaoming");
jsonObject.insert("age", 18);
QJsonDocument jsonDocument;
jsonDocument.setObject(jsonObject);
QByteArray dataArray = jsonDocument.toJson();
if(m_udpSocket->writeDatagram(dataArray ,QHostAddress("127.0.0.1"), 7755) == -1){qDebug() << "send UDP data package failed!";
}
}
接收端目录结构如下:
文章图片
接收端源码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H#include
#include QT_BEGIN_NAMESPACE
class QUdpSocket;
QT_END_NAMESPACEnamespace Ui {
class Widget;
}class Widget : public QWidget
{
Q_OBJECTpublic:
explicit Widget(QWidget *parent = 0);
~Widget();
protected:
void analysisByteArray(QByteArray data);
protected slots:
void readPendingData();
private:
Ui::Widget *ui;
QUdpSocket *m_udpSocket;
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle("Receiver");
m_udpSocket = new QUdpSocket(this);
if(!m_udpSocket->bind(7755)){QMessageBox::information(this, "tip", "bind port failed!");
return;
}
connect(m_udpSocket, SIGNAL(readyRead()), this, SLOT(readPendingData()));
}Widget::~Widget()
{
delete ui;
}void Widget::analysisByteArray(QByteArray data)
{
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsonDocument::fromJson(data, &json_error));
if(json_error.error != QJsonParseError::NoError){qDebug() << "json error!";
return;
}QJsonObject rootObj = jsonDoc.object();
QStringList keys = rootObj.keys();
for(int i = 0;
i < keys.size();
i++){if(i == 0)
qDebug() << "key" << i << " is:" << keys.at(i) << rootObj.value(keys.at(i)).toString();
else
qDebug() << "key" << i << " is:" << keys.at(i) << rootObj.value(keys.at(i)).toInt();
}}void Widget::readPendingData()
{
while(m_udpSocket->hasPendingDatagrams()){QNetworkDatagram datagram = m_udpSocket->receiveDatagram();
analysisByteArray(datagram.data());
}
}
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- 7.9号工作总结~司硕
- Android中的AES加密-下
- 高天天工作室|溧清的剧本4
- opencv|opencv C++模板匹配的简单实现
- 如果你是一名工作乐之者,996的工作又算得了什么()
- 为什么985/211的学生能胜任工作获得老板的青睐。
- 【读书笔记】贝叶斯原理
- 【韩语学习】(韩语随堂笔记整理)
- 2019-10-24工作感悟