使用udp传中文QString的demo

 项目业务中需要使用UDP传QString给另一个设备,但是UDP传数据需要先转化为QByterray,此时会遇到一个问题:中文的QString直接转成ascii码会出现????的字样(QT4为toascii,QT5为tolatin1),需要使用toLocal8Bit() 方法将其转码,接收端再用GBK去解。

使用UDP时,需要创建相应的套接字并绑定端口(可通过读取配置文件方式,这里demo图省事写死了),QHostAddress::any意在监听这个端口收到的所有UDP数据(适合无双网口的纯内网环境)

以下是接收端口

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_receiver=new QUdpSocket(this);
    //绑定发送端,ShareAddress允许多接收端绑定6666端口
    m_receiver->bind(QHostAddress::Any,6667);
//    m_receiver->bind(QHostAddress::LocalHost,6667);
    //当接收端接收到数据时,就会发送readRead信号
    connect(m_receiver,&QUdpSocket::readyRead,this,&Widget::processData);
}

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

void Widget::processData()
{
    //有未处理的数据报
    while(m_receiver->hasPendingDatagrams()){
        QByteArray dataGram;
        //读取的数据报大小
        dataGram.resize(m_receiver->pendingDatagramSize());
        m_receiver->readDatagram(dataGram.data(),dataGram.size());
        QTextCodec *after = QTextCodec::codecForName("GBK");
        QString tmp = after->toUnicode(dataGram);
        ui->label->setText(tmp);
        qDebug()<<"QBytearray转回QString"<<tmp;
    }

}

 以下是发送端

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

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    m_sender=new QUdpSocket(this);
}

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

void Widget::on_pushButton_clicked()
{
    QByteArray dataGram="wwwwww";
    QString str = "卧槽";
    dataGram = str.toLocal8Bit();
    m_sender->writeDatagram(dataGram.data(),
                            dataGram.size(),
                            QHostAddress::Broadcast,    //udp广播地址
                            6667);

    QTextCodec *after = QTextCodec::codecForName("GBK");
    QString tmp = after->toUnicode(dataGram);
    qDebug()<<"QBytearray转回QString"<<tmp;
}
创建widget即可,写界面绑定个槽,记得在pro文件添加QT+=network模块,不然头文件不认识
QUdpSocket*这个类
       

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值