UDP(UserDatagram Protocol即用户数据报协议)是一个轻量级的,不可靠的,面向数据报的无连接协议。对于UDP我们不再进行过多介绍,如果你对UDP不是很了解,而且不知道它有什么用,那么这里就举个简单的例子:我们现在几乎每个人都使用的腾讯QQ,其聊天时就是使用UDP协议进行消息发送的。就像QQ那样,当有很多用户,发送的大部分都是短消息,要求能及时响应,并且对安全性要求不是很高的情况下使用UDP协议。
在Qt中提供了QUdpSocket 类来进行UDP数据报(datagrams)的发送和接收。这里我们还要了解一个名词Socket,也就是常说的“套接字”。 Socket简单地说,就是一个IP地址加一个port端口。因为我们要传输数据,就要知道往哪个机子上传送,而IP地址确定了一台主机,但是这台机子上可能运行着各种各样的网络程序,我们要往哪个程序中发送呢?这时就要使用一个端口来指定UDP程序。所以说,Socket指明了数据报传输的路径。
案例
pro 中加入network
发送端.h
#include <QMainWindow>
#include <QtNetwork>
#include <QUdpSocket>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked(); //发送按纽
private:
Ui::MainWindow *ui;
QUdpSocket *m_sender; //发送端
};
发送端.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_sender=new QUdpSocket(this); //创建
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//广播
QByteArray datagram="hello Qt!!";
m_sender->writeDatagram(datagram.data(),datagram.size(),
QHostAddress::Broadcast,1000);
}
接受方.h
#include <QMainWindow>
#include <QtNetwork>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public slots:
void processDatagram(); //解析数据
private:
Ui::MainWindow *ui;
QUdpSocket *m_recevier; //接受
};
接受方.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_recevier=new QUdpSocket(this); //构建
m_recevier->bind(1000,QUdpSocket::ShareAddress);
connect(m_recevier,SIGNAL(readyRead()),
this,SLOT(processDatagram()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::processDatagram()
{
while(m_recevier->hasPendingDatagrams()) //拥有等待的数据报
{
QByteArray datagram; //拥于存放接收的数据报
//让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
datagram.resize(m_recevier->pendingDatagramSize());
//接收数据报,将其存放到datagram中
m_recevier->readDatagram(datagram.data(),datagram.size());
//将数据报内容显示出来
ui->label->setText(datagram);
}
}