Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包
原理以及运行
原理是因为QJsonDocument提供了一个函数toJson
可以直接把Json数据转成QByteArray,这样就可以直接发送数据包,然后再按照常规方法解析即可,本源码中含解析内容,详细的解析过程在如下的连接中!
Qt工作笔记-Qt5 利用QJson从文件读取Json并解析
https://blog.****.net/qq78442761/article/details/84761428
发送了json数据,用串口调试工具运行截图如下:
本例子运行动态图如下:
源码
发送端结构如下:
发送端源码如下:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
QT_BEGIN_NAMESPACE
class QUdpSocket;
QT_END_NAMESPACE
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
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 <QApplication>
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 <QUdpSocket>
#include <QMessageBox>
#include <QHostAddress>
#include <QDebug>
#include <stdlib.h>
#include <QJsonObject>
#include <QJsonDocument>
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 <QWidget>
#include <QByteArray>
QT_BEGIN_NAMESPACE
class QUdpSocket;
QT_END_NAMESPACE
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
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 <QApplication>
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 <QUdpSocket>
#include <QMessageBox>
#include <QHostAddress>
#include <QDebug>
#include <stdlib.h>
#include <QJsonObject>
#include <QNetworkDatagram>
#include <QJsonDocument>
#include <QJsonParseError>
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());
}
}