找回密码
 注册
关于网站域名变更的通知
查看: 620|回复: 1
打印 上一主题 下一主题

迅为4412开发板Qt网络编程-UDP实现服务器和客户端

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-5-13 10:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

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

x
UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常用在传输音视频等数据量非常大的场合。* m& O7 W3 I& c: y/ v6 l
udp 网络编程只需要使用一个类 QUdpSocket。* _4 V# y: R; x
3 R9 z+ r" a$ i- q8 e% `
本实验中对 QUdpSocket 的基本使用:- E6 q; R3 x) r: o, l2 X6 v
1.创建 QUdpSocket 对象。
0 C7 c) J$ F% Y: r2.绑定端口号3 X9 l; y4 |& T6 [* s
3.数据到来触发 readyRead()信号。
9 r; ^& @+ X9 {- F& p; ~; g& a0 U4.读取发送数据。
6 q$ B, C( f, h7 V7 t% p5.关闭。; W9 Y- ]0 D; C7 |0 v
具体步骤:0 c9 I" n$ g3 i1 N. f# {; J7 l- M
步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。" q8 M4 A7 ^& W/ f% o
5 t( p+ O/ p$ Q' h
步骤二:编写代码
. u1 z: ?, t' {: r- T  v1.创建 QUdpSocket 对象,使用 bind 函数绑定端口号和套接字,数据报到来后会发出信 号
8 d% z( c2 e5 m6 j8 V(),在绑定的槽函数内去读取数据。4 W( {; a) d. A$ U1 [: o
2.读取数据,数据到来 hasPendingDatagrams()返回 true,再用 pendingDatagramSize()获取数据报的长度,如果数据没有被读取& \& U' Q) Y; u0 o! Z8 W$ R! m1 [
完,hasPendingDatagrams()就会返回 true,直至数据都被读取完。
2 J- D. Z  M  N' t3 Y7 wreadDatagram(data,size);& x) v  Z( S/ s
参数 data 为读取的数据,size 为数据长度。
# l0 Z5 M) g- q, Z  `4 ?  Y3.发送数据,使用 writeDatagram 函数,% z; O+ ~9 C* ]: a7 s
writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);% a0 C5 a6 N3 y
Data:发送的数据。
+ O. _6 _. Q( }9 I0 K* ^Len:发送的数据长度。
# u' {0 {+ [/ x* k8 l& KHost:目标 IP 地址。/ z  q7 A' e6 Z  F4 l  ]& y
Port:目标端口号。$ X/ J% j1 h. ^+ X6 D
4.关闭 socket 套接字。' g: P7 d9 X7 l/ w- i
代码如下:
) g: y1 \2 i( c( P2 D6 a' U( s
  1. udp.h
    $ J3 i& x% m5 J4 A/ b; U. d
  2. #include <QMainWindow>1 V0 n4 h6 T9 I) O* E0 g0 [
  3. #include <QUdpSocket>: k$ L/ M$ W: F$ Y
  4. namespace Ui {" _2 _# Y, g* ^( N6 [: m9 z9 e8 p' R, T
  5. class Udp;
    : G& B- h7 @0 J% ^" u( U4 a
  6. }4 F0 F  f( x" P& e' T
  7. class Udp : public QMainWindow
      f4 P* j+ Q$ i; c+ n9 p, D6 V' l
  8. {0 V5 p2 z( K  [
  9. Q_OBJECT9 \8 I/ O" z, p, I8 Y! k. z
  10. public:
    - \# R9 D, I" i* t: X
  11. explicit Udp(QWidget *parent = 0); ~Udp();; Z3 O2 o# u* M# l) n
  12. QUdpSocket * udpSocket;5 D1 C. q& A! L6 O
  13. private slots:* W7 n$ [! Q0 ~0 o6 U4 I+ m! b4 |
  14. void on_pushButton_clicked();
    - Z4 b. n( R5 Q
  15. void readyRead_Slot(void);1 T) M( V9 y) d3 U6 u
  16. void on_pushButton_3_clicked();, U2 @4 l0 h* H5 J) @3 G9 q1 o5 W
  17. void on_pushButton_2_clicked();& n8 i, J2 u0 @! E
  18. private:
    * Y" s4 i8 {, I: L" n7 Z6 p* b
  19. Ui::Udp *ui;
    3 f. {6 N% t: {: f( y6 ^" {3 T
  20. };
    0 N( _3 w  }4 ~
  21. udp.cpp:/ j9 t6 ]  }& K+ T$ Y  e! S
  22. Udp::Udp(QWidget *parent) :5 b5 L- [6 n& z4 w7 u# E
  23. QMainWindow(parent), ui(new Ui::Udp)
    . \1 z/ U; a0 D( e* z/ [
  24. {) T8 }  s9 \3 L3 U3 `! c
  25. ui->setupUi(this);4 f9 [. _7 c& U
  26. udpSocket = new QUdpSocket(this);' [( `, n3 b6 \  O
  27. }
    / _* k* Y$ y1 V. H$ G% G
  28. Udp::~Udp()
    - J% B2 A. Z9 P
  29. {, ]7 x! x( ^- C0 C' @0 h$ V: B
  30. delete ui;7 J- G( @8 {! T$ g
  31. }5 a  C, B! k3 e9 W- ~: [" j' z
  32. /*% i  L3 P7 g; i
  33. * 打开按钮  y# w' ]' u8 H
  34. */
    % _3 x, K* c/ k" G# @3 s3 @6 r
  35. void Udp::on_pushButton_clicked()
    ; G0 [% B2 l/ C/ T% F
  36. {0 g/ k3 x& j% a$ L
  37. //绑定本端口的端口号
    ' \7 T1 w9 A+ V4 [! R+ j0 _
  38. if(udpSocket->bind(ui->cliEdit->text().toUInt()) == true){& n$ U# d2 q1 c9 s
  39. QMessageBox::information(this,"提示","成功");
    5 W; R: [0 l6 j) m
  40. }else{
    2 i6 K3 Q! s; ?
  41. QMessageBox::information(this,"提示","失败");
    % @4 t" ]' _5 ?+ G& n* z) K
  42. }& H& S1 n6 h6 m; a4 Z3 f
  43. //绑定数据信号和槽函数. M, [' |" {1 f- E6 @* F  L
  44. connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));, {5 |* G8 d: J- t( f" u
  45. }: l8 I6 d) f& g9 `+ t8 |$ U
  46. /*) W6 N* J4 h+ C$ s, ?7 ]& {5 P/ _0 X
  47. *读取数据槽函数/ P, G5 g% P# N/ c- n
  48. */: e& m9 d" L; C" Y( h
  49. void Udp::readyRead_Slot()$ E+ ~/ \* j+ W3 P; P( C
  50. {( b: |/ A2 o6 w/ @$ l0 E$ `
  51. QString buf;+ E3 S: y% {: m( e  g+ ?9 d
  52. QByteArray array;
    ' f; I& j4 t$ F% s3 d0 W
  53. //hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取
    ! z6 d( k# j6 i: y/ S: c
  54. while(udpSocket->hasPendingDatagrams()){
      ]$ b& t  ?# O. e  o9 n
  55. //获取数据, b' Z7 A) U; I4 P
  56. array.resize(udpSocket->pendingDatagramSize());
    0 C( ^: B; L/ e( ^% h
  57. udpSocket->readDatagram(array.data(),array.size());2 |. ^/ q* K( S+ _9 D
  58. buf = array.data();1 x2 V2 w# E9 F# K4 g6 B( u
  59. ui->recvEdit->appendPlainText(buf);
    0 z$ B) Y, d& H4 i9 @# h
  60. }( e) v) }# H4 t; d) H" p. a1 z5 w
  61. }
    - n5 e5 P; S+ y# b& [, ?7 n
  62. /*
    $ J6 W2 z8 g# t
  63. * 发送数据/ ?3 t7 P: P8 u3 b# S  x7 s
  64. */3 o8 W9 }, x5 J, D2 V
  65. void Udp::on_pushButton_3_clicked()6 y4 j5 U1 x! @& w1 S" }
  66. {
    7 e& C2 }+ l3 u; X
  67. quint16 port;# D" B. @, G% [3 Z' k0 i
  68. QString sendBuff;
    + [* _" k4 F! ?
  69. QHostAddress address;5 o, f2 }( E$ S3 i
  70. address.setAddress(ui->ipEdit->text());//目标机地址0 v) X) c+ q$ W; W5 S
  71. port = ui->portEdit->text().toInt();//目标机端口号
    : h* m, ]9 w9 {. r" y6 L, N
  72. sendBuff = ui->sendEdit->text();//发送的数据0 h8 i3 ]+ A  d$ H+ s3 P/ n
  73. //发送
    + A, ^6 x0 p  l4 l) C/ `+ y2 v3 i
  74. udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);
    9 n6 ~1 I" ^8 D; V. {
  75. }8 A. t; e9 O3 C8 A
  76. /*+ o! I' O# ~+ l! b( h
  77. *关闭! v0 j/ h, O% {0 d
  78. */# j/ \* h; ~+ x# @# T: i& j
  79. void Udp::on_pushButton_2_clicked()0 K! U+ X! N: \9 H
  80. {
    - x9 j2 _( i4 v9 X
  81. udpSocket->close();
    , [" l$ _% @& V  ?
  82. }
复制代码

6 T+ q: X0 ^$ l, N: W, X: o
1 j+ V  Y  l& t. a5 q
  • TA的每日心情
    慵懒
    2020-6-13 15:46
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2021-5-14 13:12 | 只看该作者
    4412开发板Qt网络编程-UDP实现服务器和客户端
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-24 21:57 , Processed in 0.171875 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表