我正在编写一个程序,该程序在输入时会发出带有一些数据的消息。我希望能够通过多播发送udp消息,并且希望能够以xml格式发送该消息。目前,我的程序是使用qt编写的,如果可能的话,我希望将其保存在qt中。
从文档中,我可以通过以下方式使用udp套接字创建和发送数据:
udpSocket = new QUdpSocket(this);
QByteArray datagram = "stuff here";
udpSocket->writeDatagram(datagram.data(), datagram.size(), groupAddress, port)
其中,groupaddress是我向其发送消息的IP地址,而port是我向其发送消息的端口。
另一方面,我可以使用:
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
的文档中:
因此,您应该首先连接到对等方:
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();