zoukankan      html  css  js  c++  java
  • 迅为4412开发板Qt网络编程-UDP实现服务器和客户端

    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 套接字。
    代码如下:

    udp.h
    #include <QMainWindow>
    #include <QUdpSocket>
    namespace Ui {
    class Udp;
    }
    class Udp : public QMainWindow
    {
    Q_OBJECT
    public:
    explicit Udp(QWidget *parent = 0); ~Udp();
    QUdpSocket * udpSocket;
    private slots:
    void on_pushButton_clicked();
    void readyRead_Slot(void);
    void on_pushButton_3_clicked();
    void on_pushButton_2_clicked();
    private:
    Ui::Udp *ui;
    };
    udp.cpp:
    Udp::Udp(QWidget *parent) :
    QMainWindow(parent), ui(new Ui::Udp)
    {
    ui->setupUi(this);
    udpSocket = new QUdpSocket(this);
    }
    Udp::~Udp()
    {
    delete ui;
    }
    /*
    * 打开按钮
    */
    void Udp::on_pushButton_clicked()
    {
    //绑定本端口的端口号
    if(udpSocket->bind(ui->cliEdit->text().toUInt()) == true){
    QMessageBox::information(this,"提示","成功");
    }else{
    QMessageBox::information(this,"提示","失败");
    }
    //绑定数据信号和槽函数
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot()));
    }
    /*
    *读取数据槽函数
    */
    void Udp::readyRead_Slot()
    {
    QString buf;
    QByteArray array;
    //hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取
    while(udpSocket->hasPendingDatagrams()){
    //获取数据
    array.resize(udpSocket->pendingDatagramSize());
    udpSocket->readDatagram(array.data(),array.size());
    buf = array.data();
    ui->recvEdit->appendPlainText(buf);
    }
    }
    /*
    * 发送数据
    */
    void Udp::on_pushButton_3_clicked()
    {
    quint16 port;
    QString sendBuff;
    QHostAddress address;
    address.setAddress(ui->ipEdit->text());//目标机地址
    port = ui->portEdit->text().toInt();//目标机端口号
    sendBuff = ui->sendEdit->text();//发送的数据
    //发送
    udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port);
    }
    /*
    *关闭
    */
    void Udp::on_pushButton_2_clicked()
    {
    udpSocket->close();
    }
    

      

  • 相关阅读:
    用Canvas绘制一个钟表
    用css3做一个3D立方体
    函数调用的不同方式,以及this的指向
    Javascript 严格模式use strict详解
    前端开发页面的性能优化方案总结
    Promise对象解读
    Vue爬坑之vuex初识
    WEB前端性能优化小结
    navicat 注册码
    docker
  • 原文地址:https://www.cnblogs.com/liyue3/p/14763605.html
Copyright © 2011-2022 走看看