0


Qt中对Udp数据打包发送和接收

有些小伙伴对怎么对Udp的数据打包不太清楚。下面我举例说明。

比如我们要发送一个Person的数据。可以先用一个结构把Person的数据封装。

  1. struct Person {
  2. QString name;
  3. int age;
  4. };

下面是udp客户端和服务器端完整的代码例子。

  1. #ifndef UDPCLIENT_H
  2. #define UDPCLIENT_H
  3. #include <QObject>
  4. #include <QUdpSocket>
  5. struct Person {
  6. QString name;
  7. int age;
  8. };
  9. class UdpClient : public QObject
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit UdpClient(QObject *parent = nullptr);
  14. void sendDatagram(const QByteArray &data);
  15. private slots:
  16. void readPendingDatagrams();
  17. private:
  18. void processDatagram(const QNetworkDatagram &datagram);
  19. QUdpSocket *udpSocket;
  20. };
  21. #endif // UDPCLIENT_H
  22. #include "UdpClient.h"
  23. #include <QDataStream>
  24. #include <QNetworkDatagram>
  25. UdpClient::UdpClient(QObject *parent) : QObject(parent) {
  26. udpSocket = new QUdpSocket(this);
  27. udpSocket->bind(QHostAddress::LocalHost, 1235);
  28. connect(udpSocket, &QUdpSocket::readyRead, this, &UdpClient::readPendingDatagrams);
  29. }
  30. void UdpClient::sendDatagram(const QByteArray &data) {
  31. udpSocket->writeDatagram(data, QHostAddress::LocalHost, 1234);
  32. }
  33. void UdpClient::readPendingDatagrams() {
  34. while (udpSocket->hasPendingDatagrams()) {
  35. QNetworkDatagram datagram = udpSocket->receiveDatagram();
  36. processDatagram(datagram);
  37. }
  38. }
  39. void UdpClient::processDatagram(const QNetworkDatagram &datagram) {
  40. QByteArray data = datagram.data();
  41. // Here you would process the data
  42. QDataStream stream(data);
  43. Person person;
  44. stream >> person.name >> person.age;
  45. // 现在你可以使用 person 结构中的数据
  46. qDebug() << "Received person: " << person.name << ", " << person.age;
  47. }
  48. #ifndef UDPSERVER_H
  49. #define UDPSERVER_H
  50. #include <QObject>
  51. #include <QUdpSocket>
  52. class UdpServer : public QObject
  53. {
  54. Q_OBJECT
  55. public:
  56. explicit UdpServer(QObject *parent = nullptr);
  57. private slots:
  58. void readPendingDatagrams();
  59. private:
  60. void processDatagram(const QNetworkDatagram &datagram);
  61. QUdpSocket *udpSocket;
  62. };
  63. #endif // UDPSERVER_H
  64. #include "UdpServer.h"
  65. #include <QNetworkDatagram>
  66. UdpServer::UdpServer(QObject *parent) : QObject(parent) {
  67. udpSocket = new QUdpSocket(this);
  68. udpSocket->bind(QHostAddress::LocalHost, 1234);
  69. connect(udpSocket, &QUdpSocket::readyRead, this, &UdpServer::readPendingDatagrams);
  70. }
  71. void UdpServer::readPendingDatagrams() {
  72. while (udpSocket->hasPendingDatagrams()) {
  73. QNetworkDatagram datagram = udpSocket->receiveDatagram();
  74. processDatagram(datagram);
  75. }
  76. }
  77. void UdpServer::processDatagram(const QNetworkDatagram &datagram) {
  78. QByteArray data = datagram.data();
  79. // Here you would process the data
  80. // ...
  81. //qDebug() << "Received data from client: " << data.toStdString().c_str();
  82. // Sending a response back to the sender
  83. udpSocket->writeDatagram(data, datagram.senderAddress(), datagram.senderPort());
  84. }
  85. #include <QCoreApplication>
  86. #include <QDataStream>
  87. #include "UdpServer.h"
  88. #include "UdpClient.h"
  89. int main(int argc, char *argv[])
  90. {
  91. QCoreApplication a(argc, argv);
  92. UdpServer server;
  93. UdpClient client;
  94. Person person;
  95. person.name = "Alice";
  96. person.age = 30;
  97. QByteArray datagram;
  98. QDataStream stream(&datagram, QIODevice::WriteOnly);
  99. stream << person.name << person.age;
  100. client.sendDatagram(datagram);
  101. return a.exec();
  102. }
标签: udp 网络协议 网络

本文转载自: https://blog.csdn.net/exlink2012/article/details/134338376
版权归原作者 天天进步2015 所有, 如有侵权,请联系我们删除。

“Qt中对Udp数据打包发送和接收”的评论:

还没有评论