Qt-网络与通信-UDP网络通讯

举报
DreamLife 发表于 2022/04/15 01:20:34 2022/04/15
【摘要】 用户数据报协议是一种简单的轻量级、不可靠、面向数据、无连接的传出层协议,可以应用于在可靠性不是十分重要的场合,如短消息,广播信息等。 例如一下场合 网络数据大多为短消息 拥有大量客户端 对数据安全性无特殊要求 网络负担飞常重,但对响应速度要求高   示例截图   服务器代码 .h #ifnd...

用户数据报协议是一种简单的轻量级、不可靠、面向数据、无连接的传出层协议,可以应用于在可靠性不是十分重要的场合,如短消息,广播信息等。

例如一下场合

网络数据大多为短消息

拥有大量客户端

对数据安全性无特殊要求

网络负担飞常重,但对响应速度要求高

 

示例截图

 

服务器代码

.h


  
  1. #ifndef UDPSERVER_H
  2. #define UDPSERVER_H
  3. #include <QDialog>
  4. #include <QLabel>
  5. #include <QLineEdit>
  6. #include <QPushButton>
  7. #include <QVBoxLayout>
  8. #include <QUdpSocket>
  9. #include <QTimer>
  10. class UdpServer : public QDialog
  11. {
  12. Q_OBJECT
  13. public:
  14. UdpServer(QWidget *parent = 0);
  15. ~UdpServer();
  16. public slots:
  17. void StartBtnClicked();
  18. void timeout();
  19. private:
  20. QLabel *TimerLabel;
  21. QLineEdit *TextLineEdit;
  22. QPushButton *StartBtn;
  23. QVBoxLayout *mainLayout;
  24. int port;
  25. bool isStarted;
  26. QUdpSocket *udpSocket;
  27. QTimer *timer;
  28. };
  29. #endif // UDPSERVER_H

 

.cpp

 

 


  
  1. #include "udpserver.h"
  2. UdpServer::UdpServer(QWidget *parent)
  3. : QDialog(parent)
  4. {
  5. setWindowTitle(tr("UDP Server"));
  6. TimerLabel = new QLabel(tr("计时器:"),this);
  7. TextLineEdit = new QLineEdit(this);
  8. StartBtn = new QPushButton(tr("Start"),this);
  9. mainLayout = new QVBoxLayout(this);
  10. mainLayout->addWidget(TimerLabel);
  11. mainLayout->addWidget(TextLineEdit);
  12. mainLayout->addWidget(StartBtn);
  13. connect(StartBtn,SIGNAL(clicked(bool)),this,SLOT(StartBtnClicked()));
  14. port = 5555;
  15. isStarted = false;
  16. udpSocket = new QUdpSocket(this);
  17. timer = new QTimer(this);
  18. connect(timer,SIGNAL(timeout()),this,SLOT(timeout()));
  19. }
  20. UdpServer::~UdpServer()
  21. {
  22. }
  23. void UdpServer::StartBtnClicked()
  24. {
  25. if(!isStarted)
  26. {
  27. StartBtn->setText("Stop");
  28. timer->start(1000);
  29. isStarted = true;
  30. }
  31. else
  32. {
  33. StartBtn->setText("Start");
  34. isStarted = false;
  35. timer->stop();
  36. }
  37. }
  38. void UdpServer::timeout()
  39. {
  40. QString msg = TextLineEdit->text();
  41. int length = 0;
  42. if(msg =="")
  43. {
  44. return;
  45. }
  46. if((length = udpSocket->writeDatagram(msg.toLatin1(),msg.length(),QHostAddress::Broadcast,port)) != msg.length())
  47. {
  48. return;
  49. }
  50. }

 

客户端代码

 

.h


  
  1. #ifndef UDPCLIENT_H
  2. #define UDPCLIENT_H
  3. #include <QDialog>
  4. #include <QVBoxLayout>
  5. #include <QTextEdit>
  6. #include <QPushButton>
  7. #include <QUdpSocket>
  8. class UdpClient : public QDialog
  9. {
  10. Q_OBJECT
  11. public:
  12. UdpClient(QWidget *parent = 0);
  13. ~UdpClient();
  14. public slots:
  15. void CloseBtnClicked();
  16. void dataReceived();
  17. private:
  18. QTextEdit *ReceiveTextEdit;
  19. QPushButton *CloseBtn;
  20. QVBoxLayout *mainLayout;
  21. int port;
  22. QUdpSocket *udpSocket;
  23. };
  24. #endif // UDPCLIENT_H

 

.cpp

 


  
  1. #include "udpclient.h"
  2. #include <QMessageBox>
  3. #include <QHostAddress>
  4. UdpClient::UdpClient(QWidget *parent)
  5. : QDialog(parent)
  6. {
  7. setWindowTitle("UODClient");
  8. ReceiveTextEdit = new QTextEdit(this);
  9. CloseBtn = new QPushButton("close",this);
  10. mainLayout = new QVBoxLayout(this);
  11. mainLayout->addWidget(ReceiveTextEdit);
  12. mainLayout->addWidget(CloseBtn);
  13. connect(CloseBtn,SIGNAL(clicked(bool)),this,SLOT(CloseBtnClicked()));
  14. port = 5555;
  15. udpSocket = new QUdpSocket(this);
  16. connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));
  17. bool result = udpSocket->bind(port);
  18. if(!result)
  19. {
  20. QMessageBox::information(this,"Error","udp socket create error!");
  21. return;
  22. }
  23. }
  24. UdpClient::~UdpClient()
  25. {
  26. }
  27. void UdpClient::CloseBtnClicked()
  28. {
  29. close();
  30. }
  31. void UdpClient::dataReceived()
  32. {
  33. while (udpSocket->hasPendingDatagrams())
  34. {
  35. QByteArray datagram;
  36. datagram.resize(udpSocket->pendingDatagramSize());
  37. udpSocket->readDatagram(datagram.data(),datagram.size());
  38. QString msg = datagram.data();
  39. ReceiveTextEdit->insertPlainText(msg);
  40. }
  41. }

 

 

 

工程连接:https://gitee.com/DreamLife-Technology_DreamLife/UDPProject

 

 

 

 

文章来源: dreamlife.blog.csdn.net,作者:DreamLife.,版权归原作者所有,如需转载,请联系作者。

原文链接:dreamlife.blog.csdn.net/article/details/79406029

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。