通过UDP发送XML数据

时间:2014-08-21 15:26:50

标签: c++ xml qt udp qudpsocket

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

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

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

其中groupaddress是我发送消息的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消息发送该数据包。您需要确保您的数据包足够小,以便路由在到达目的地的途中不会被分解。

1 个答案:

答案 0 :(得分:1)

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