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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常用在传输音视频等数据量非常大的场合。
3 v& C3 j1 J# ^' M. W' C0 Iudp 网络编程只需要使用一个类 QUdpSocket。
& ^0 k5 W& v. A2 `+ H2 Y: u$ @" R# n * {8 o5 y0 N2 {# |4 D
本实验中对 QUdpSocket 的基本使用:1 m& d+ F. ]' W, e0 ]+ ^
1.创建 QUdpSocket 对象。: a7 l' T7 `: V" L
2.绑定端口号8 D+ J9 X1 b6 Z0 F
3.数据到来触发 readyRead()信号。
6 x( |' m3 p/ s6 `' u+ i$ i9 }) @4.读取发送数据。# m* I. `0 w. ?( C5 n" x. ^
5.关闭。) O6 D, y& p- m: O" B9 [
具体步骤:
7 p/ _% w7 [/ ?# I" A步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。: I! x- e8 L: M7 e5 a( F) m6 b9 z
. H' k) E8 Z+ `/ E5 Q$ r
步骤二:编写代码
5 i& B: \0 ^- n7 V0 }% ]1.创建 QUdpSocket 对象,使用 bind 函数绑定端口号和套接字,数据报到来后会发出信 号
* k7 A1 M5 x. _/ ~: T8 c+ ?(),在绑定的槽函数内去读取数据。4 i! j% q  Q& e  ?( \9 Y5 d
2.读取数据,数据到来 hasPendingDatagrams()返回 true,再用 pendingDatagramSize()获取数据报的长度,如果数据没有被读取6 i6 f0 `4 _) E, v. g
完,hasPendingDatagrams()就会返回 true,直至数据都被读取完。, V+ [4 B+ a( Q; Y, ~, _
readDatagram(data,size);
/ ~8 m0 c0 c6 f0 s9 M* F9 I; B参数 data 为读取的数据,size 为数据长度。, Q$ w( R- \' [1 F; W  W8 _* z6 |
3.发送数据,使用 writeDatagram 函数,2 s: b4 a+ l5 U8 y# ~
writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);
: F5 ~: K4 B# m8 n; QData:发送的数据。# f" D* U3 G; a# ~* l3 a
Len:发送的数据长度。
+ W; G. X; s5 PHost:目标 IP 地址。
1 p) v( M  [# D7 L3 ]5 Y% ~Port:目标端口号。3 n: c! k, h2 l" M
4.关闭 socket 套接字。) _; g  F; K- G6 @
代码如下:6 ?+ X- v- f# q3 ?
  1. udp.h, c4 l- B! C) Q& C& N. R. E; S
  2. #include <QMainWindow>
    4 t, i  c: ^; S
  3. #include <QUdpSocket>5 s0 x  T5 A8 R
  4. namespace Ui {; c4 ^* s( S4 \2 A. F. P; l
  5. class Udp;+ M# s* {: k- d5 E9 p3 G: O
  6. }$ C8 x7 u3 u1 b/ k. k
  7. class Udp : public QMainWindow* q) r. S( q! n/ J
  8. {
      ]/ a7 e7 A# Q3 x  T, b
  9. Q_OBJECT4 n& U1 y& m$ B) Y3 k
  10. public:
    . p0 i' H9 ?; f( w# Y" o' ^
  11. explicit Udp(QWidget *parent = 0); ~Udp();/ e. T' I+ i/ f5 @6 J1 [) L
  12. QUdpSocket * udpSocket;  L4 S' \9 j1 S: n  P: f
  13. private slots:+ G( q: |% h2 F% |8 V3 s2 C
  14. void on_pushButton_clicked();
    2 ^& x# p( [1 Z/ k) T6 p. G! l9 O
  15. void readyRead_Slot(void);1 @6 V* F) T- y: K  H
  16. void on_pushButton_3_clicked();
    $ s, ^$ u& p2 R% }" x! Y( u
  17. void on_pushButton_2_clicked();, v' p  Z3 u# o
  18. private:& d) @: ?. H% m/ ~  n
  19. Ui::Udp *ui;
    $ p  n: ]" c! H" v: t; V
  20. };
    8 p0 o" W( z( _$ s' U- I+ N
  21. udp.cpp:. P) B7 W/ u& v9 s/ i# m" n
  22. Udp::Udp(QWidget *parent) :" l* K! k0 w4 i& \* I  ^8 T9 e) r$ L# C
  23. QMainWindow(parent), ui(new Ui::Udp)
      }, i$ b) P& {( l6 {- N
  24. {
      c& [. M  _3 C
  25. ui->setupUi(this);) m$ U, Q; A1 O; _& N5 B4 s
  26. udpSocket = new QUdpSocket(this);2 @; i  Q1 A; l: n0 r4 [
  27. }
    * h4 q2 ~$ J+ _  a1 C
  28. Udp::~Udp()
    ( a1 ]" ?! u: X5 }0 a2 ]& s. z
  29. {2 ?/ Y( f1 N& X# X5 b
  30. delete ui;. k7 T1 X% S7 ^* X2 `
  31. }8 R: z; R) ~4 P  ~8 @
  32. /*
    # x  S$ O* l5 b0 o" u
  33. * 打开按钮0 e$ W$ w" p% T9 `( l
  34. */7 U6 n9 L9 z+ ~$ j
  35. void Udp::on_pushButton_clicked()8 m3 P3 X! D% _$ y, P
  36. {5 a5 z  K; V5 i# q
  37. //绑定本端口的端口号/ s! E. \# w' k: W
  38. if(udpSocket->bind(ui->cliEdit->text().toUInt()) == true){
    2 N, I( ^+ l) y  n2 q. h/ r
  39. QMessageBox::information(this,"提示","成功");
    ; H& C9 h* _7 P" m
  40. }else{
    / T$ A1 ~0 D2 s5 ^- u3 y/ d4 P" k
  41. QMessageBox::information(this,"提示","失败");
    $ N; d8 o6 m* |7 x
  42. }
    " F  I7 E, k& Z6 q+ [* R* i4 Q
  43. //绑定数据信号和槽函数" X. a  f- X* ~- O* o& b
  44. connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));1 j* D& y1 {1 g) b1 {2 @
  45. }
    : d$ x" N# L3 i: |
  46. /*
    : b2 L! b: @) ]6 K
  47. *读取数据槽函数
    : @# E, Z2 ]" F) H  t
  48. */; Z+ h+ g2 F: q& E5 S6 e# m
  49. void Udp::readyRead_Slot()
    ) m- B3 B' S- z! z9 `  }. P
  50. {
    4 a3 z4 P$ G. X
  51. QString buf;7 ^2 K% d/ m& f6 j3 h( z7 j
  52. QByteArray array;/ \: y) p6 u# V  ^3 s
  53. //hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取2 ^, P& m& X. O0 P, ], V: r
  54. while(udpSocket->hasPendingDatagrams()){
    9 J, i9 k9 F1 [* _. i. M# \
  55. //获取数据
    9 i( ^. _! Q& ^7 a) K: ~: |
  56. array.resize(udpSocket->pendingDatagramSize());" a4 N% |4 f" {  }0 P
  57. udpSocket->readDatagram(array.data(),array.size());' B2 _2 s6 A& H4 U) p
  58. buf = array.data();* @1 ~2 Z/ L3 o! I* S6 B0 R
  59. ui->recvEdit->appendPlainText(buf);
    + M3 j" i$ {# E# E! ?' D
  60. }1 z* ^& W6 O$ L! d- U8 H6 F
  61. }: q: T5 R2 h' M. ~" x, T% q% L
  62. /*7 q+ Z3 O- z; @
  63. * 发送数据' W+ r0 `6 z: j# E5 X8 m* q+ L" ]
  64. */0 r1 m! N, h, O6 W: K
  65. void Udp::on_pushButton_3_clicked()
    & z5 a3 L; A1 a. O
  66. {6 B  i- Z" l$ a0 |  O2 D( [
  67. quint16 port;
    " g& m* F4 n7 b, e, }
  68. QString sendBuff;: y' q7 W! ]. c5 ~
  69. QHostAddress address;$ a& g. ^4 U( R) r% @3 `1 I; A: f3 p
  70. address.setAddress(ui->ipEdit->text());//目标机地址! ?- g  l/ P( y1 m+ O0 e, H. J8 y
  71. port = ui->portEdit->text().toInt();//目标机端口号
    # g4 ~: z) l0 _6 z' w* d
  72. sendBuff = ui->sendEdit->text();//发送的数据
    + ^! p% B% @+ k/ s  L
  73. //发送
    3 n% o9 ^1 V: K9 q
  74. udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);% p# Z# J7 Z' U; ]/ _
  75. }
    6 Q2 d- u: y/ R4 i7 V( m
  76. /*
    + r8 N# k* v6 C% I& L
  77. *关闭) m* ^* Y, ]+ y. B8 J$ ]9 x
  78. */
    6 s/ W* B7 e6 S1 k: H+ I% Y* A
  79. void Udp::on_pushButton_2_clicked()
    ! Y2 H6 s  _# t/ |' x' \
  80. {
    $ D1 R, r& c8 R* Y* }
  81. udpSocket->close();- i6 \  _! P  H
  82. }
复制代码

) z4 E$ p# A! G/ x% z! L3 @% p3 e) S$ z$ X8 V, R% x' K
  • 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-7-15 04:49 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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