[嵌入式Linux] 迅为4412开发板Qt网络编程-UDP实现服务器和客户端

[复制链接]
2529|0
 楼主| linzhao789 发表于 2021-5-13 10:58 | 显示全部楼层 |阅读模式
UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常用在传输音视频等数据量非常大的场合。
udp 网络编程只需要使用一个类 QUdpSocket。

本实验中对 QUdpSocket 的基本使用:
1.创建 QUdpSocket 对象。
2.绑定端口号
3.数据到来触发 readyRead()信号。
4.读取发送数据。
5.关闭。
具体步骤:
步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。

步骤二:编写代码
1.创建 QUdpSocket 对象,使用 bind 函数绑定端口号和套接字,数据报到来后会发出信 号
(),在绑定的槽函数内去读取数据。
2.读取数据,数据到来 hasPendingDatagrams()返回 true,再用 pendingDatagramSize()获取数据报的长度,如果数据没有被读取
完,hasPendingDatagrams()就会返回 true,直至数据都被读取完。
readDatagram(data,size);
参数 data 为读取的数据,size 为数据长度。
3.发送数据,使用 writeDatagram 函数,
writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);
Data:发送的数据。
Len:发送的数据长度。
Host:目标 IP 地址。
Port:目标端口号。
4.关闭 socket 套接字。
代码如下:

  1. udp.h

  2. #include <QMainWindow>

  3. #include <QUdpSocket>

  4. namespace Ui {

  5. class Udp;

  6. }

  7. class Udp : public QMainWindow

  8. {

  9. Q_OBJECT

  10. public:

  11. explicit Udp(QWidget *parent = 0); ~Udp();

  12. QUdpSocket * udpSocket;

  13. private slots:

  14. void on_pushButton_clicked();

  15. void readyRead_Slot(void);

  16. void on_pushButton_3_clicked();

  17. void on_pushButton_2_clicked();

  18. private:

  19. Ui::Udp *ui;

  20. };

  21. udp.cpp:

  22. Udp::Udp(QWidget *parent) :

  23. QMainWindow(parent), ui(new Ui::Udp)

  24. {

  25. ui->setupUi(this);

  26. udpSocket = new QUdpSocket(this);

  27. }

  28. Udp::~Udp()

  29. {

  30. delete ui;

  31. }

  32. /*

  33. * 打开按钮

  34. */

  35. void Udp::on_pushButton_clicked()

  36. {

  37. //绑定本端口的端口号

  38. if(udpSocket->bind(ui->cliEdit->text().toUInt()) == true){

  39. QMessageBox::information(this,"提示","成功");

  40. }else{

  41. QMessageBox::information(this,"提示","失败");

  42. }

  43. //绑定数据信号和槽函数

  44. connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));

  45. }

  46. /*

  47. *读取数据槽函数

  48. */

  49. void Udp::readyRead_Slot()

  50. {

  51. QString buf;

  52. QByteArray array;

  53. //hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取

  54. while(udpSocket->hasPendingDatagrams()){

  55. //获取数据

  56. array.resize(udpSocket->pendingDatagramSize());

  57. udpSocket->readDatagram(array.data(),array.size());

  58. buf = array.data();

  59. ui->recvEdit->appendPlainText(buf);

  60. }

  61. }

  62. /*

  63. * 发送数据

  64. */

  65. void Udp::on_pushButton_3_clicked()

  66. {

  67. quint16 port;

  68. QString sendBuff;

  69. QHostAddress address;

  70. address.setAddress(ui->ipEdit->text());//目标机地址

  71. port = ui->portEdit->text().toInt();//目标机端口号

  72. sendBuff = ui->sendEdit->text();//发送的数据

  73. //发送

  74. udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);

  75. }

  76. /*

  77. *关闭

  78. */

  79. void Udp::on_pushButton_2_clicked()

  80. {

  81. udpSocket->close();

  82. }


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

253

主题

697

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部