通过 UDP 发送 XML 数据

Send XML data by UDP

本文关键字:数据 XML 发送 UDP 通过      更新时间:2023-10-16

我正在编写一个程序,该程序在输入时会发送包含一些数据的消息。 我希望能够通过多播发送 udp 消息,并且我希望能够以 xml 格式发送此消息。 目前我的程序是用qt编写的,如果可能的话,我想把它保留在qt中。

从文档中,我可以通过以下方法使用 udp 套接字创建和发送数据:

udpSocket = new QUdpSocket(this);
QByteArray datagram = "stuff here";
udpSocket->writeDatagram(datagram.data(), datagram.size(), groupAddress, port)

其中,组地址是我要向其发送邮件的 IP 地址,端口是我发送邮件的端口。

另一方面,我可以使用:

QXmlStreamWriter xml;
xml.setDevice(QIODevice);
发送XML数据,

QIODevice可以向文件发送数据,也可以通过TCP发送数据,并以XML格式格式化所有数据。

但是,我找不到一种方法将udpSocket设置为QXmlStreamWriter的设备,并设置为在以这种方式传递时自动发送该数据。 有没有办法做到这一点? 还是我必须将所有内容格式化为字节数组才能将其发送出去?

编辑:以防其他人偶然发现这个寻找信息。Nejat描述的方法(列为答案(确实会通过UDP发送xml数据。 但是,QXmlStreamWriter 最终会发送大量数据包,如果您尝试发送单个格式化的 xml 块,这不是很有用。 如果需要发送格式化的 xml 块,则需要执行以下操作:

第 1 步:创建 udp 套接字

udpSocket = new QUdpSocket(this);

第 2 步:创建一个 QByteArray,并将其设置为 QXmlStreamWriter 正在写入的"设备"。

QByteArray message;
QXmlStreamWriter xml(&message);
//proceed to write the xml like you would normally

第 3 步:像文档状态一样发送您的 QByteArray 消息。

udpSocket->writeDatagram(message.data(), message.size(), groupAddress, port);

这样做将创建一个大的数据包,然后通过UDP消息发送该数据包。 由您来确保您的数据包足够小,以至于在到达目的地的途中不会被路由破坏。

QUdpSocket继承

QAbstractSocket,也继承自QIODevice。因此,您可以将QUdpSocket传递给QXmlStreamWriter构造函数。这将允许您通过流写入设备。

从有关QUdpSocket的文档:

如果你想使用标准的QIODevice函数read((, readLine((、write(( 等,必须先直接连接套接字 通过调用 connectToHost(( 到对等体。

所以你应该首先连接到一个对等体:

udpSocket = new QUdpSocket(this);
udpSocket->connectToHost(ip, port);
udpSocket->waitForConnected(1000);
QXmlStreamWriter xml(udpSocket);
xml.setAutoFormatting(true);
xml.writeStartDocument();
...
xml.writeStartElement("bookmark");
xml.writeTextElement("title", "Some Text");
xml.writeEndElement();
...
xml.writeEndDocument();