【Qt专栏】Qt实现UDP单播通信


前言

网络通信是程序员必须会的一项生存技能,这里简单的实现了UDP单播通信的一个小实例,代码可以直接拿来用,开发环境是Qt5.9.6。


一、UDP通信实例

1.项目架构

在这里插入图片描述

2.udpsendreceive.h文件
#ifndef UDPSENDRECEIVE_H
#define UDPSENDRECEIVE_H

#include <QWidget>

#include <QUdpSocket>
#include <QtNetwork>

namespace Ui {
class UdpSendReceive;
}

class UdpSendReceive : public QWidget
{
    Q_OBJECT

public:
    explicit UdpSendReceive(QWidget *parent = nullptr);
    ~UdpSendReceive();
    void initNetwork(quint16 port);
    void stopNetwork();

private slots:
//自定义槽函数
    void    onSocketReadyRead();//读取socket传入的数据

    void on_pushButton_clicked();

private:
    Ui::UdpSendReceive *ui;
    QUdpSocket  *udpSocket;//
    QString getLocalIP();//获取本机IP地址

};

#endif // UDPSENDRECEIVE_H
3.udpsendreceive.cpp文件
#include "udpsendreceive.h"
#include "ui_udpsendreceive.h"

UdpSendReceive::UdpSendReceive(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::UdpSendReceive)
{
    ui->setupUi(this);
    initNetwork(5555);
}

UdpSendReceive::~UdpSendReceive()
{
    stopNetwork();
    delete ui;
}

void UdpSendReceive::initNetwork(quint16 port)
{
    udpSocket=new QUdpSocket(this);//用于与连接的客户端通讯的QTcpSocket
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(onSocketReadyRead()));

    if (udpSocket->bind(port))//绑定监听端口成功
        ui->plainTextEdit->appendPlainText("***已成功绑定端口:"+QString::number(udpSocket->localPort()));
    else
        ui->plainTextEdit->appendPlainText("***绑定失败***");
}

void UdpSendReceive::stopNetwork()
{
    udpSocket->abort(); //不能解除绑定
    ui->plainTextEdit->appendPlainText("***已解除绑定***");
    delete udpSocket;
}

void UdpSendReceive::onSocketReadyRead()
{//读取收到的数据报
    while(udpSocket->hasPendingDatagrams())
    {
        QByteArray   datagram;
        datagram.resize(udpSocket->pendingDatagramSize());

        QHostAddress peerAddr;
        quint16 peerPort;
        udpSocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort);
        QString str=datagram.data();
        QString peer="[From "+peerAddr.toString()+":"+QString::number(peerPort)+"] ";

        ui->plainTextEdit->appendPlainText(peer+str);
    }
}

QString UdpSendReceive::getLocalIP()
{
    QString ipString = Q_NULLPTR;
    QHostInfo hostInfo = QHostInfo::fromName(QHostInfo::localHostName());   //从本地主机名称获取主机信息
    QList<QHostAddress> listAddr = hostInfo.addresses();    //本地主机ip地址列表(IPV4/IPV6)
    foreach (auto addr, listAddr)
    {
        if((addr.isNull() == false) && (addr.protocol() == QAbstractSocket::IPv4Protocol)
                && (addr != QHostAddress::LocalHost))
        {
            ipString = addr.toString();   //根据条件筛选出本地IPV4地址
        }
    }
    return ipString;
}

void UdpSendReceive::on_pushButton_clicked()
{
    QString  msg=ui->lineEdit->text();//发送的消息内容
    QByteArray  str=msg.toUtf8();

    QString     targetIP=getLocalIP(); //目标IP
    QHostAddress    targetAddr(targetIP);

    quint16     targetPort=5555;//目标port(同一计算机上运行需要绑定不同的端口,确保ip+port唯一)

    udpSocket->writeDatagram(str,targetAddr,targetPort); //发出数据报

    ui->lineEdit->setFocus();
    if(ui->lineEdit->text().isEmpty())return;
    ui->lineEdit->clear();

    ui->plainTextEdit->appendPlainText("[发送] "+msg);
}

4.参数效果

在这里插入图片描述


总结

好了,这个小程序写完并可以运行进行通信,简单的实现,原理后序会专门写篇文章,这里可以直接照着上述写就OK啦,886!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拉伊卜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值