Qt学习记录(十一)实现简单udp

本文档记录了使用Qt进行简单UDP通信的实现过程。通过创建两个UI界面,分别用于发送和接收信息,并详细介绍了从初始化属性、创建套接字到消息发送与接收的每个步骤。实验结果显示通信功能成功实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体思路

  • 搭建l两个ui界面(实现两个界面信息的发送与接收)
  • 一个端口具体实现如下
    • 初始化属性:发送端口,接收端口,接收IP地址
    • 创建套接字
    • 绑定自身端口
    • 点击发送按钮,发送报文
      • 发送消息
      • 消息追加到聊天记录窗口
      • 清空输入框
    • 监听报文
      • 数据同步到聊天记录窗口

具体实现

以Qt Widgets Application为模板,建立项目,新类命名为udp1,继承自QWidgets,建立完成后,对udp1.ui进行设计,界面如下:

在.pro文件中加上语句

QT += network  

这样就可以使用QUdpSocket头文件

在udp1.h中声明套接字

#include<QUdpSocket>

public:
    //声明套接字
    QUdpSocket* udp;

udp1.cpp进行修改如下:

#include "udp1.h"
#include "ui_udp1.h"

Udp1::Udp1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Udp1)
{
    ui->setupUi(this);

    //设置属性
    ui->myport->setText("8888");
    ui->toport->setText("9999");
    ui->toip->setText("127.0.0.1");

    //创建套接字
    udp = new QUdpSocket(this);
    //绑定自身端口号
    udp->bind(ui->myport->text().toInt());
    //点击发送按钮,发送报文
    connect(ui->sendBtn,&QPushButton::clicked,[=](){
        //输入内容纯文本发送用text edit的toPlainText函数(该函数为QString类型,利用成员函数
        //toUtf8()转换为QByteArray),带有颜色等复杂特效的文字用
        //toHtml函数
        //书写报文 参数1 内容 参数2 对方IP 参数3 对方端口
        udp->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->toip->text()),
        ui->toport->text().toInt());

        //聊天记录窗口进行记录
        ui->record->append("my say:"+ui->input->toPlainText());
        //清空输入
        ui->input->clear();
    });

    //接收数据
    //发送数据后,套接字接收端会自动有一个readyRead信号
    connect(udp,&QUdpSocket::readyRead,[=](){
        //获取报文长度
        qint64 size = udp->pendingDatagramSize();
        QByteArray array = QByteArray(size,0);
        //char* QByteArray::data()
        //读取报文
        udp->readDatagram(array.data(),size);
        //将数据同步到聊天记录中
        ui->record->append(array);
    });
}

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

为项目添加新文件,选择Qt->设计师界面类,对udp2.ui进行和udp1.ui同样的修改,dup2.h和udp2.cpp模仿udp1.h,udp2.cpp进行同样修改,只需要更改端口号即可

完整程序如下:

main.cpp

//main.cpp
#include "udp1.h"
#include <QApplication>
#include"udp2.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Udp1 w;
    w.show();

    udp2 u2;
    u2.show();

    return a.exec();
}

udp1.h

//udp1.h
#ifndef UDP1_H
#define UDP1_H

#include <QWidget>
#include<QUdpSocket>
namespace Ui {
class Udp1;
}

class Udp1 : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Udp1 *ui;
public:
    //声明套接字
    QUdpSocket* udp;
};

#endif // UDP1_H

udp1.cpp

//udp1.cpp
#include "udp1.h"
#include "ui_udp1.h"

Udp1::Udp1(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Udp1)
{
    ui->setupUi(this);

    //设置属性
    ui->myport->setText("8888");
    ui->toport->setText("9999");
    ui->toip->setText("127.0.0.1");

    //创建套接字
    udp = new QUdpSocket(this);
    //绑定自身端口号
    udp->bind(ui->myport->text().toInt());
    //点击发送按钮,发送报文
    connect(ui->sendBtn,&QPushButton::clicked,[=](){
        //输入内容纯文本发送用text edit的toPlainText函数(该函数为QString类型,利用成员函数
        //toUtf8()转换为QByteArray),带有颜色等复杂特效的文字用
        //toHtml函数
        //书写报文 参数1 内容 参数2 对方IP 参数3 对方端口
        udp->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->toip->text()),
        ui->toport->text().toInt());

        //聊天记录窗口进行记录
        ui->record->append("my say:"+ui->input->toPlainText());
        //清空输入
        ui->input->clear();
    });

    //接收数据
    //发送数据后,套接字接收端会自动有一个readyRead信号
    connect(udp,&QUdpSocket::readyRead,[=](){
        //获取报文长度
        qint64 size = udp->pendingDatagramSize();
        QByteArray array = QByteArray(size,0);
        //char* QByteArray::data()
        //读取报文
        udp->readDatagram(array.data(),size);
        //将数据同步到聊天记录中
        ui->record->append(array);
    });
}

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

udp2.h

//udp2.h
#ifndef UDP2_H
#define UDP2_H

#include <QWidget>
#include<QUdpSocket>
namespace Ui {
class udp2;
}

class udp2 : public QWidget
{
    Q_OBJECT

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

private:
    Ui::udp2 *ui;
public:
    QUdpSocket* udp;
};

#endif // UDP2_H

udp2.cpp

//udp2.cpp
#include "udp2.h"
#include "ui_udp2.h"

udp2::udp2(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::udp2)
{
    ui->setupUi(this);

    //设置属性
    ui->myport->setText("9999");
    ui->toport->setText("8888");
    ui->toip->setText("127.0.0.1");

    //创建套接字
    udp = new QUdpSocket(this);
    //绑定自身端口号
    udp->bind(ui->myport->text().toInt());
    //点击发送按钮,发送报文
    connect(ui->sendBtn,&QPushButton::clicked,[=](){
        //输入内容纯文本发送用text edit的toPlainText函数(该函数为QString类型,利用成员函数
        //toUtf8()转换为QByteArray),带有颜色等复杂特效的文字用
        //toHtml函数
        //书写报文 参数1 内容 参数2 对方IP 参数3 对方端口
        udp->writeDatagram(ui->input->toPlainText().toUtf8(),QHostAddress(ui->toip->text()),
        ui->toport->text().toInt());

        //聊天记录窗口进行记录
        ui->record->append("my say:"+ui->input->toPlainText());
        //清空输入
        ui->input->clear();
    });

    //接收数据
    //发送数据后,套接字接收端会自动有一个readyRead信号
    connect(udp,&QUdpSocket::readyRead,[=](){
        //获取报文长度
        qint64 size = udp->pendingDatagramSize();
        QByteArray array = QByteArray(size,0);
        //char* QByteArray::data()
        //读取报文
        udp->readDatagram(array.data(),size);
        //将数据同步到聊天记录中
        ui->record->append(array);
    });
}

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

实验结果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值