项目业务中需要使用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*这个类