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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常用在传输音视频等数据量非常大的场合。
( o0 n& b6 }; {+ E+ tudp 网络编程只需要使用一个类 QUdpSocket。7 U2 c- y4 p; I2 |
2 y3 t! e$ n( q7 p8 b* ~. P
本实验中对 QUdpSocket 的基本使用:- @( Y: D8 Z: @4 Q" S  N7 a+ g
1.创建 QUdpSocket 对象。
1 `: F1 J4 U' L7 E+ h2.绑定端口号8 h7 Q7 O3 ?5 F6 `: W
3.数据到来触发 readyRead()信号。
2 t  V0 c8 M, o, g9 H8 d9 H4.读取发送数据。$ _/ c! Q! C9 Q
5.关闭。
- B0 s& F0 d' E+ L" _- ]具体步骤:
, N' Y! Q% j6 D# A0 o步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。
& ]) ~$ C7 S( F3 \, o# T
( X0 x( m" x! R1 {7 K步骤二:编写代码# S" V6 {! f' d, Z7 q! D
1.创建 QUdpSocket 对象,使用 bind 函数绑定端口号和套接字,数据报到来后会发出信 号
" W; u0 a! i( L9 {(),在绑定的槽函数内去读取数据。+ D# o5 l  Y0 G
2.读取数据,数据到来 hasPendingDatagrams()返回 true,再用 pendingDatagramSize()获取数据报的长度,如果数据没有被读取
9 N9 q, [; R4 B7 F3 |完,hasPendingDatagrams()就会返回 true,直至数据都被读取完。
( R/ J2 \8 M. |+ v4 p* Y& |9 xreadDatagram(data,size);
8 h( ^- h: c" B; I参数 data 为读取的数据,size 为数据长度。
! V+ I9 i' o1 I* {' _& j/ K6 }1 f3.发送数据,使用 writeDatagram 函数,
$ j, u4 o, J$ a7 H+ [/ fwriteDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);. ?/ P* e5 {1 v/ R5 v3 l+ J
Data:发送的数据。4 w/ h" {8 l8 K" d) p
Len:发送的数据长度。
" E& ~6 v$ k$ z6 |Host:目标 IP 地址。" B( n; i5 F, f8 {% M4 c
Port:目标端口号。9 Z: n& W" ~& g) q# ]
4.关闭 socket 套接字。9 ^( K! o, g2 u0 a8 u6 Q: Y
代码如下:
1 ~2 l, J$ T) O; p
  1. udp.h4 P! d( d1 d; j1 P6 ^8 Y% i1 Q
  2. #include <QMainWindow>6 U$ t; t4 J# e# C! M: O, _
  3. #include <QUdpSocket>4 D+ Z) y8 ?5 m3 i. s4 v5 S
  4. namespace Ui {  b5 _* c$ |! G4 m7 L
  5. class Udp;
    % `7 o5 T5 X& B# ~% }# a
  6. }
    5 y) z6 U, I3 Q
  7. class Udp : public QMainWindow
    & p7 b0 @, ~- V" x( U6 d
  8. {
    # V4 c  q/ m7 G; b/ ]
  9. Q_OBJECT# P; _/ }/ ?0 l: N" A7 t
  10. public:" c4 l0 b# `5 y/ r' P; [- f
  11. explicit Udp(QWidget *parent = 0); ~Udp();, y0 X$ t$ e' n' ^4 K- D
  12. QUdpSocket * udpSocket;* s3 o+ y) l- o7 i. Q1 `: L4 d
  13. private slots:8 f6 K. t. G: I9 e5 D
  14. void on_pushButton_clicked();3 m$ c6 a) P$ k: ]) a
  15. void readyRead_Slot(void);; d! C; T# O4 q/ i/ Y' A0 I; L; I
  16. void on_pushButton_3_clicked();
    0 h0 E, P& y$ u( M+ z* C6 J4 M2 o: v/ G
  17. void on_pushButton_2_clicked();
    6 z+ w4 y/ v3 a/ I# H2 C
  18. private:9 L' k, B: [6 k, ?4 H) H
  19. Ui::Udp *ui;: Z1 A! d4 l3 N
  20. };
    2 V* G/ d# c( X& }: t
  21. udp.cpp:2 i+ @6 j& E* X3 [5 g: _8 l
  22. Udp::Udp(QWidget *parent) :# x2 C: E* [/ }
  23. QMainWindow(parent), ui(new Ui::Udp)
    ; L% L4 ?) A! Q0 `2 X, Y
  24. {; U$ H( o" y8 S" m- h6 D% V
  25. ui->setupUi(this);* G, `3 @/ L( S
  26. udpSocket = new QUdpSocket(this);
    , j: ^1 q1 T$ W3 V: W
  27. }
    % K; r% S4 p" l0 M0 z, O
  28. Udp::~Udp()
    ) ]! X$ p  y; N; w
  29. {+ a1 k$ a+ s3 w' y4 n: q
  30. delete ui;' }1 q" s4 E( [" g, T
  31. }9 C% ~' y- C+ M
  32. /*
    & I( J4 k  a5 t% n- ]- ]
  33. * 打开按钮! \9 O" u8 s' w  E' e5 O  D( y- \
  34. */
    ) H2 h4 C. T  w) H8 ]2 p. ~7 O
  35. void Udp::on_pushButton_clicked()) [1 m( A+ C8 a& U9 p7 l6 x
  36. {
    2 ~: y0 F/ g+ u) e/ V, C
  37. //绑定本端口的端口号- c  I. w) g" q, m0 y
  38. if(udpSocket->bind(ui->cliEdit->text().toUInt()) == true){% |0 n9 K# l% f( \+ K( u, _
  39. QMessageBox::information(this,"提示","成功");! h$ U7 Y5 Q- W; _
  40. }else{# J% {* M! n4 K& W" k* d9 W! e
  41. QMessageBox::information(this,"提示","失败");2 E5 I4 h2 F0 j
  42. }
    0 m$ z4 r; W- t  f# I4 b1 L
  43. //绑定数据信号和槽函数
    . K# L" u2 R. _$ ~1 z
  44. connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));; f5 O: Q% j- C0 P, |9 g1 C) k
  45. }" Y9 C) f: L* m0 ?$ z: {+ @2 ]+ x
  46. /*
    5 s2 D, N" f  s
  47. *读取数据槽函数
    4 c0 P1 F9 c* \' L8 q5 F
  48. */4 u, J9 w9 r% b# j
  49. void Udp::readyRead_Slot(); E# @2 w+ Y8 o7 z" W& P& C6 h
  50. {3 t6 ]4 C+ L6 U: t
  51. QString buf;
    / ~8 ^# s* _5 m! W) M- }( y/ u6 b
  52. QByteArray array;
    / t3 D; j/ j$ k7 }) ?8 y- T- h
  53. //hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取
    $ j1 x5 V  E4 S; i6 }7 [8 n; [
  54. while(udpSocket->hasPendingDatagrams()){9 y# W- d1 f6 H, ~0 `, C3 G! f
  55. //获取数据$ ]& R0 u4 ^1 t! i
  56. array.resize(udpSocket->pendingDatagramSize());
    * u8 [) a+ T. Q) \# a- C2 v
  57. udpSocket->readDatagram(array.data(),array.size());
    & [( o" U# V9 t( b0 w9 \  A
  58. buf = array.data();
    5 j: j3 L1 S6 e" G' y- ?
  59. ui->recvEdit->appendPlainText(buf);
    ! J& M3 U7 L8 h4 h9 S, O$ p
  60. }
    . p3 P! B0 G: H& h  t+ v
  61. }/ s, x2 r& n% ]$ Z$ M4 X
  62. /*, L' G* e" V% B0 q
  63. * 发送数据- J4 ?. P. c8 P# }) p% h1 n
  64. */
    - L1 E2 B- Z2 ~- b  I
  65. void Udp::on_pushButton_3_clicked()
    ) F9 }4 `% l6 f9 R( p; o
  66. {7 w/ e6 k2 c+ _: S, b% k" p
  67. quint16 port;
    ) F! F8 b( S' d/ j
  68. QString sendBuff;' y* @* p1 ^  Z# C/ |
  69. QHostAddress address;2 {3 T$ b; O' `4 j0 L
  70. address.setAddress(ui->ipEdit->text());//目标机地址$ f. ~5 a3 p- T
  71. port = ui->portEdit->text().toInt();//目标机端口号
    ! n2 y7 d2 H* Q9 \& F6 I1 a- X
  72. sendBuff = ui->sendEdit->text();//发送的数据
    ( Q6 a9 @9 g: e. e: n7 P
  73. //发送
    + T7 ^/ P! x% k
  74. udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);
    5 l6 ]- a( @) s6 s2 @8 n9 \: g
  75. }
      X! `$ }7 p5 J# Y8 O2 T  v# D
  76. /*
    2 w* v, h8 G  g7 G: G/ R# Q
  77. *关闭
    - v4 f% W. B2 ?3 O1 C+ `4 `
  78. */
    ' z# C3 S0 _# W. e+ c) q& q- X
  79. void Udp::on_pushButton_2_clicked()
    2 u/ ?" l) A% |  n: }3 |* \
  80. {
    ' q: Q0 D9 P2 X) q9 ^8 {; V
  81. udpSocket->close();
    ; ^5 w3 L8 K  r# ^- y" e& v; ~+ A
  82. }
复制代码
% X" A, p) `7 h5 C
2 S' @8 g3 `. T7 R' i
  • 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 13:41 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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