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

原理以及运行

原理是因为QJsonDocument提供了一个函数toJson

Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包_第1张图片

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

 

Qt工作笔记-Qt5 利用QJson从文件读取Json并解析

https://blog.csdn.net/qq78442761/article/details/84761428

 

发送了json数据,用串口调试工具运行截图如下:

Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包_第2张图片

 

本例子运行动态图如下:

 

源码

发送端结构如下:

Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包_第3张图片

发送端源码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 

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 

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!";
    }
}

 

接收端目录结构如下:

Qt工作笔记-发送端发送Json格式的数据包,接收端解析数据包_第4张图片

接收端源码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include 
#include 

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 

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());
    }
}

 

你可能感兴趣的:(C/C++,Qt,TCP/IP,工作笔记)