rain-xuan 发表于 2021-3-14 10:23

QT中的UDP编程(新人菜鸟,如有错误请指正)

# QUdpSocket

<h2>QT的UDP协议:</h2>

1. windows的UDP编程模型

   | 服务器                                       | 客户端                   |
   | -------------------------------------------- | ------------------------ |
   | 0.协议版本信息                               | 0.协议版本信息         |
   | 1.创建socket                                 | 1.创建socket             |
   | 2.服务器协议地址簇                           | 2.获取服务器的协议地址簇 |
   | 3.绑定                                       | 3.通信:往服务器发数据   |
   | 4.接受客户端数据,顺百年获取客户端协议地址簇 |                        |
   | 5. 关闭                                    | 4. 关闭                  |

   <strong>recv + accpet == recvfrom</strong>

   <strong>send + connect ==sendto</strong>

2. QT的UDP编程模型

   | 服务器                                                       | 客户端                     |
   | ------------------------------------------------------------ | ---------------------------- |
   | 1.创建socket对象 (QUdpSocket)                              | 1.创建socket对象(QUdpSocket) |
   | 2.绑定(QUdpSocket::bind)                                 |                              |
   | 3.收数据 信号发送者:QUdpSocket对象信号接收者:当前对象信号:QUdpSocket::readyRead | 2.通信                     |
   | 4. 发数据收:readDatagram发: writeDatagram               |                              |
   | 5. 关闭                                                      | 3. 关闭                      |

<h2>服务器端的界面设计</h2>

![服务器端界面](https://gitee.com/youngrainforest/imag/raw/master/imag//image-20210225224113653.png)

<h2>客户端界面设计</h2>

![客户端界面](https://gitee.com/youngrainforest/imag/raw/master/imag//image-20210225224201888.png)

<strong>可以将textEdit_recv设置为ReadOnly</strong>

## QUdpSocket服务器端代码

0. 在.pro文件中添加

   ~~~c++
   QT+=network
   ~~~

1. 创建socket对象

   + 在头文件中加入``#include <QUdpSocket>``
   + 在类的定义的private中添加`QUdpSocket* pQUdpSocket`
   + 在构造器中`pQUdpSocket = new QUdpSocket(this)`

2. 绑定

   `pQUdpSocket->bind(8888)`,8888位服务器的端口号

3. 数据的接收(信号)

   ~~~c++
   connect(pQUdpSocket,&QUdpSocket::readyRead,this,[=](){
      //收数据
       char buff={0};
       QHostAddress ip;
       quint16 port;
       pQUdpSocket->readDatagram(buff,1024,&ip,&port);
      
       //数据的显示
       QString str = QString("ip:%1,port:%2,msg:%3").arg(ip.toString()).arg(port).grg(buff);
      
       ui->textEdit_recv->append();
   });
   ~~~

   槽,到ui设计界面,选中发送的PushButton,右键转到槽,选择clicked()

   ~~~c++
   //获取ip,port,msg
   QString ip = ui->lineEdit_IP->text();
   QString port = ui->lineEdit_port->text();
   QString msg = ui->textEdit_send->toPlainText();
   
   pQUdpSocket->writeDatagram(msg.toUtf8(),QHostAddress(ip),port.toUInt());
   ~~~

## QUdpSocket客户端代码

和服务端差不多,去掉绑定这一步就行了。

wqc159 发表于 2021-3-14 11:02

加油,QT自带的例子下面有完整的udp收发,广播例子,直接copy过来,改吧改吧,弄成类,不需要造轮子了。{:1_918:}
我就是这么干的。

bwuaich 发表于 2021-3-14 11:30

楼上的大佬; 说的也可行; 或者度娘, G oogle 更好 ,

MarvinJ 发表于 2021-3-15 14:25

刚好在学习TCP和UDP,感谢lz的分享:lol
页: [1]
查看完整版本: QT中的UDP编程(新人菜鸟,如有错误请指正)