Qt学习笔记—网络编程(UDP)

Qt中QUdpSocket类进行收发UDP数据包,该类父类是QAbstractSocket。

简单地说,套接字socket = IP地址 + port端口号

IP指定网络中的哪一个主机

port端口号指定主机的哪一个应用程序

要使用UDP,工程文件中必须添加QT += network

涉及的方法

是否有数据可读:

bool QUdpSocket::hasPendingDatagrams() const  

读数据:

qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR)    //读数据
    
NetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)

当前可读数据大小

qint64 QUdpSocket::pendingDatagramSize() const

读数据:

qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
    
qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)
    
qint64 QUdpSocket::writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)

UDP 发送端

class Udp_Sender : public QWidget
{
    Q_OBJECT

public:
    explicit Udp_Sender(QWidget *parent = 0);
    ~Udp_Sender();

    void initUdpSocket(void);
    void sendDatagram(void);

private:
    Ui::Udp_Sender *ui;
    QUdpSocket *udp;
};
Udp_Sender::Udp_Sender(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Udp_Sender)
{
    ui->setupUi(this);
    setWindowTitle(tr("UDP 发送端"));
    initUdpSocket();
}

Udp_Sender::~Udp_Sender()
{
    delete ui;
}

void Udp_Sender::initUdpSocket(void)
{
    udp = new QUdpSocket(this);
    connect(ui->pushButton, &QPushButton::clicked, this, &Udp_Sender::sendDatagram);
}

void Udp_Sender::sendDatagram(void)
{
    QString dataStr = ui->textEdit->document()->toPlainText();
    QByteArray datagram;
    datagram.append(dataStr); 
    udp->writeDatagram( datagram, QHostAddress::Broadcast, 7878); //发送数据  
}

QHostAddress::Broadcast  //特殊的广播地址,意味着所有主机,但不是互联网上的所有主机

UDP接收端

class Udp_Recevier : public QWidget
{
    Q_OBJECT

public:
    explicit Udp_Recevier(QWidget *parent = 0);
    ~Udp_Recevier();

    void processDatagram(void);
    void initSocket(void);

private:
    Ui::Udp_Recevier *ui;
    QUdpSocket *udp;
};
#include "udp_recevier.h"
#include "ui_udp_recevier.h"
#include <QNetworkDatagram>

Udp_Recevier::Udp_Recevier(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Udp_Recevier)
{
    ui->setupUi(this);
    setWindowTitle(tr("UDP接收者"));
    initSocket();
}

Udp_Recevier::~Udp_Recevier()
{
    delete ui;
}

void Udp_Recevier::processDatagram()
{
    while (udp->hasPendingDatagrams())
    {
        QNetworkDatagram datagram = udp->receiveDatagram(); //接收一个数据报

        QString dataStr(datagram.data()); //将接收到的数据转换为QSting
        ui->textBrowser->append(dataStr); //在textBrowser上显示接收到的数据
    }

}

void Udp_Recevier::initSocket()
{
    udp = new QUdpSocket(this);
    //绑定端口号、地址 QUdpSocket::ShareAddress 允许其他服务绑定到相同端口地址
    udp->bind(7878, QUdpSocket::ShareAddress);  
    connect(udp, &QUdpSocket::readyRead, this, &Udp_Recevier::processDatagram);
}

结果:

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欲盖弥彰1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值