C/C++|Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包

原理以及运行 原理是因为QJsonDocument提供了一个函数toJson
C/C++|Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包
文章图片

可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容,详细的解析过程在如下的连接中!

Qt工作笔记-Qt5 利用QJson从文件读取Json并解析
https://blog.csdn.net/qq78442761/article/details/84761428
【C/C++|Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包】
发送了json数据,用串口调试工具运行截图如下:
C/C++|Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包
文章图片


本例子运行动态图如下:


源码 发送端结构如下:
C/C++|Qt工作笔记-发送端发送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!"; } }


接收端目录结构如下:
C/C++|Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包
文章图片

接收端源码如下:
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()); } }


    推荐阅读