迅为4412开发板Qt网络编程-UDP实现服务器和客户端
UDP 协议是开放式,无连接,不可靠的传输层通信协议,但它收发数据的速度相对于 TCP 快很多,常用在传输音视频等数据量非常大的场合。
udp 网络编程只需要使用一个类 QUdpSocket。
本实验中对 QUdpSocket 的基本使用:
1.创建 QUdpSocket 对象。
2.绑定端口号
3.数据到来触发 readyRead()信号。
4.读取发送数据。
5.关闭。
具体步骤:
步骤一:组装 ui 界面,和 TCP 章节搭建 UI 界面方法一致。
步骤二:编写代码
1.创建 QUdpSocket 对象,使用 bind 函数绑定端口号和套接字,数据报到来后会发出信 号
(),在绑定的槽函数内去读取数据。
2.读取数据,数据到来 hasPendingDatagrams()返回 true,再用 pendingDatagramSize()获取数据报的长度,如果数据没有被读取
完,hasPendingDatagrams()就会返回 true,直至数据都被读取完。
readDatagram(data,size);
参数 data 为读取的数据,size 为数据长度。
3.发送数据,使用 writeDatagram 函数,
writeDatagram(const char *data, qint64 len, const QHostAddress &host, quint16 port);
Data:发送的数据。
Len:发送的数据长度。
Host:目标 IP 地址。
Port:目标端口号。
4.关闭 socket 套接字。
代码如下:
udp.h #include <QMainWindow> #include <QUdpSocket> namespace Ui { class Udp; } class Udp : public QMainWindow { Q_OBJECT public: explicit Udp(QWidget *parent = 0); ~Udp(); QUdpSocket * udpSocket; private slots: void on_pushButton_clicked(); void readyRead_Slot(void); void on_pushButton_3_clicked(); void on_pushButton_2_clicked(); private: Ui::Udp *ui; }; udp.cpp: Udp::Udp(QWidget *parent) : QMainWindow(parent), ui(new Ui::Udp) { ui->setupUi(this); udpSocket = new QUdpSocket(this); } Udp::~Udp() { delete ui; } /* * 打开按钮 */ void Udp::on_pushButton_clicked() { //绑定本端口的端口号 if(udpSocket->bind(ui->cliEdit->text().toUInt()) == true){ QMessageBox::information(this,"提示","成功"); }else{ QMessageBox::information(this,"提示","失败"); } //绑定数据信号和槽函数 connect(udpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_Slot())); } /* *读取数据槽函数 */ void Udp::readyRead_Slot() { QString buf; QByteArray array; //hasPendingDatagrams()返回 true 时表示至少有一个数据报在等待被读取 while(udpSocket->hasPendingDatagrams()){ //获取数据 array.resize(udpSocket->pendingDatagramSize()); udpSocket->readDatagram(array.data(),array.size()); buf = array.data(); ui->recvEdit->appendPlainText(buf); } } /* * 发送数据 */ void Udp::on_pushButton_3_clicked() { quint16 port; QString sendBuff; QHostAddress address; address.setAddress(ui->ipEdit->text());//目标机地址 port = ui->portEdit->text().toInt();//目标机端口号 sendBuff = ui->sendEdit->text();//发送的数据 //发送 udpSocket->writeDatagram(sendBuff.toLocal8Bit().data(),sendBuff.length(),address,port); } /* *关闭 */ void Udp::on_pushButton_2_clicked() { udpSocket->close(); }