在qt下,实现基于udp通信

在qt下,udp通信的客户端和服务器程序是一模一样。我们是分析服务器端即可:

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    udpSocket = new QUdpSocket;
    //背景
    QPalette palette;  palette.setBrush(QPalette::Background,QBrush(QPixmap(":/Resourse/background/background.jpg")));
    this->setPalette(palette);
    //退出按键
    closeBt = new QPushButton(this);
    closeBt->setGeometry((float)750/800*this->geometry().width(), (float)10/480*this->geometry().height(),
                               (float)40/800*this->geometry().width(), (float)40/480*this->geometry().height());
    closeBt->setStyleSheet("QPushButton{border-image:url(:/Resource/icon/close);outline:none}");
    connect(closeBt,&QPushButton::pressed,this,&Widget::close);
}

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

//服务器部分
void Widget::readyRead_slot()
{
    /*udp读取数据和tcp读取数据是不一样的
    udp要判断,我们有没有读完 使用函数 udpSocket->hasPendingDatagrams()
    如果没有读完,他就会返回true()*/
    while(udpSocket->hasPendingDatagrams()){
        QByteArray arr;  //可以近似将他看作是数组
        //将数组大小调整成和udp剩下的内容一样大小
        arr.resize(udpSocket->pendingDatagramSize());
        //开始读  数据读到arr.data()里面,读的大小是arr.size()
        udpSocket->readDatagram(arr.data(),arr.size());
        //显示读到的数据   先转成QString类型
        QString buf = arr.data();
        ui->receEdit->appendPlainText(buf);
    }
}
//打开服务器
void Widget::on_openButton_clicked()
{
    //绑定成功,返回true
    if(udpSocket->bind(ui->localportEdit->text().toUInt())==true){
        ui->receEdit->appendPlainText("已连接");
    }else{
        ui->receEdit->appendPlainText("连接失败");
    }
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot()));
}
//关闭功能
void Widget::on_closeButton_clicked()
{
    udpSocket->close();
}
//发送数据
void Widget::on_sendButton_clicked()
{
    quint16 port;
    QString sendbuf;
    //用来装目标IP
    QHostAddress address;
    //将目标ip转换成 QHostAddress类型
    address.setAddress(ui->mipEdit->text());
    //获取目标端口
    port = ui->mportEdit->text().toUInt();
    //获取要发送的内容
    sendbuf = ui->sendEdit->text();
    //发送数据
    udpSocket->writeDatagram(sendbuf.toLocal8Bit().data(),sendbuf.length(),address,port);
    //清空内容
    ui->sendEdit->clear();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

One Piece&

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

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

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

打赏作者

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

抵扣说明:

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

余额充值