一、项目结构如下
二、各文件代码如下
TestUdpRecv.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_TestUdpRecv.h"
#include <QUdpSocket>
#include <QHostAddress>
#include <QByteArray>
class TestUdpRecv : public QMainWindow
{
Q_OBJECT
public:
TestUdpRecv(QWidget *parent = Q_NULLPTR);
~TestUdpRecv();
public slots:
void processPendingDatagrams();
private:
Ui::TestUdpRecvClass ui;
QUdpSocket *m_pUdpSocket;
};
TestUdpRecv.cpp
#include "TestUdpRecv.h"
#include <QDebug>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
TestUdpRecv::TestUdpRecv(QWidget *parent)
: QMainWindow(parent)
, m_pUdpSocket(new QUdpSocket())
{
ui.setupUi(this);
// 绑定到本地端口,例如8080
if (!m_pUdpSocket->bind(QHostAddress("127.0.0.1"), 13383)) {
qDebug() << "无法绑定到端口:" << m_pUdpSocket->errorString();
}
// 连接readyRead信号到自定义的槽函数
QObject::connect(m_pUdpSocket, &QUdpSocket::readyRead, this, &TestUdpRecv::processPendingDatagrams);
}
TestUdpRecv::~TestUdpRecv()
{
}
void TestUdpRecv::processPendingDatagrams()
{
while (m_pUdpSocket->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(m_pUdpSocket->pendingDatagramSize());
QHostAddress sender;
quint16 senderPort;
m_pUdpSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);
QJsonDocument jsonDoc = QJsonDocument::fromJson(datagram);
// 检查解析是否成功
if (jsonDoc.isNull()) {
qDebug() << "Failed to parse JSON data.";
return;
}
if (jsonDoc.isArray()) { // 检查是否为数组
QJsonArray jsonArray = jsonDoc.array();
for (int i = 0; i < jsonArray.size(); ++i) {
QJsonObject jsonObject = jsonArray.at(i).toObject();
// 从每个对象中提取值
QString code = jsonObject["code"].toString();
double value = jsonObject["value"].toDouble();
QString name = jsonObject["name"].toString();
QString time = jsonObject["time"].toString();
// 打印或者进一步处理这些值
qDebug() << "Code:" << code << ", Value:" << QString::number(value) << ", Name:" << name << ", Time:" << time;
}
}
}
}