在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();
}