【QT】UDP通信/广播/多播应用

server.ui


client和server.ui完全相同!!!!

server.h/.cpp

cpp 复制代码
class Server : public QMainWindow
{
 .....
private:
    Ui::Server *ui;
    QUdpSocket *server;
};


--------------------

#include "server.h"
#include "ui_server.h"
#include <QPushButton>
#include <QImage>
Server::Server(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);
    //实例化一个socket套节字

    server = new QUdpSocket(this);
    ui->ip1->setText("127.0.0.1");
    ui->port1->setText("8090");
    ui->port2->setText("6060");
    //绑定自己的端口

    server->bind(ui->port2->text().toInt());


    //发送数据
    connect(ui->send,&QPushButton::clicked,this,[=](){
        server->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->ip1->text()),ui->port1->text().toInt());

        ui->record->append("来自宗介的:"+ui->input->toPlainText());
        ui->input->clear();
    });
  //接收数据

    connect(server,&QUdpSocket::readyRead,this,[=]()
    {
        //返回值qint64    ------  获取即将要接收的数据报文的大小
        qint64 size = server->pendingDatagramSize();
        QByteArray array(size,0);
        server->readDatagram(array.data(),size);
        ui->record->append("来自波妞的:"+array);
    });


}

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

client.h/.cpp

cpp 复制代码
Client::Client(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);

    ui->ip1->setText("127.0.0.1");
    ui->port1->setText("6060");
    ui->port2->setText("8090");

    client = new QUdpSocket(this);

    //绑定自己的端口
    client->bind(ui->port2->text().toInt());


    //发送数据
    connect(ui->send,&QPushButton::clicked,this,[=](){
     client->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->ip1->text()),ui->port1->text().toInt() );

        ui->record->append("来自波纽的:"+ui->input->toPlainText());
        ui->input->clear();
    });
  //接收数据

    connect(client,&QUdpSocket::readyRead,this,[=]()
    {
        qint64 size = client->pendingDatagramSize();
        QByteArray array(size,0);
        client->readDatagram(array.data(),size);
        ui->record->append("来自宗介的:"+array);
    });

}

端口号一定要尽可能大!!!!!

广播

例如前面在UDP中, 我们发送信息都是指定发送的内容,对方的IP地址和对方的端口号,相当于给一个人发信息。广播的意义在于给好多人发消息。

于是IP换一下就成为广播了。

cpp 复制代码
        //广播
        server->writeDatagram(ui->input->toPlainText().toUtf8(),
                              QHostAddress::Broadcast,ui->port1->text().toInt());
                                      //255.255.255.255

组播

例如服务器要进行组播,组播的话要进行设置组播段号,同时还需要要自身绑定更改

cpp 复制代码
server->bind(QHostAddress::AnyIPv4);
//加入组播
 server->joinMulticastGroup(QHostAddress("244.0.0.10"));

         server->writeDatagram(ui->input->toPlainText().toUtf8(),
                               QHostAddress("224.0.0.10"),ui->port1->text().toInt());
相关推荐
wdfk_prog2 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
闻道且行之4 小时前
TurboOCR:基于PP-OCRv6的极速Windows离线OCR工具,深度解析3.4GB依赖背后的技术架构
c++·人工智能·python·qt·机器学习·ocr
测试员周周5 小时前
【skills5】一份 spec 生成 k6/JMeter/Locust:性能压测 + 全站截图,上线前的双保险
功能测试·网络协议·测试工具·jmeter·http·自动化·集成测试
酣大智5 小时前
常用 IP 协议号大全(IP 层承载的上层协议)
网络·网络协议·tcp/ip
许彰午5 小时前
95_Python内存管理与垃圾回收
开发语言·python
多加点辣也没关系6 小时前
JavaScript|第13章:原始类型的方法
开发语言·javascript·ecmascript
এ慕ོ冬℘゜6 小时前
深入理解 JavaScript 事件体系:Window、鼠标与键盘事件详解
开发语言·javascript·okhttp
chouchuang7 小时前
day-030-综合练习-笔记管理器
开发语言·笔记·python
云空8 小时前
《Three.js 3D实例大全》
开发语言·javascript·3d·three.js
techdashen8 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang