Qt中QUdpSocket
类进行收发UDP数据包,该类父类是QAbstractSocket。
简单地说,套接字socket
= IP地址
+ port端口号
IP指定网络中的哪一个主机
port端口号指定主机的哪一个应用程序
要使用UDP,工程文件中必须添加QT += network
涉及的方法
是否有数据可读:
bool QUdpSocket::hasPendingDatagrams() const
读数据:
qint64 QUdpSocket::readDatagram(char *data, qint64 maxSize, QHostAddress *address = Q_NULLPTR, quint16 *port = Q_NULLPTR) //读数据
NetworkDatagram QUdpSocket::receiveDatagram(qint64 maxSize = -1)
当前可读数据大小:
qint64 QUdpSocket::pendingDatagramSize() const
读数据:
qint64 QUdpSocket::writeDatagram(const char *data, qint64 size, const QHostAddress &address, quint16 port)
qint64 QUdpSocket::writeDatagram(const QNetworkDatagram &datagram)
qint64 QUdpSocket::writeDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port)
UDP 发送端
class Udp_Sender : public QWidget
{
Q_OBJECT
public:
explicit Udp_Sender(QWidget *parent = 0);
~Udp_Sender();
void initUdpSocket(void);
void sendDatagram(void);
private:
Ui::Udp_Sender *ui;
QUdpSocket *udp;
};
Udp_Sender::Udp_Sender(QWidget *parent) :
QWidget(parent),
ui(new Ui::Udp_Sender)
{
ui->setupUi(this);
setWindowTitle(tr("UDP 发送端"));
initUdpSocket();
}
Udp_Sender::~Udp_Sender()
{
delete ui;
}
void Udp_Sender::initUdpSocket(void)
{
udp = new QUdpSocket(this);
connect(ui->pushButton, &QPushButton::clicked, this, &Udp_Sender::sendDatagram);
}
void Udp_Sender::sendDatagram(void)
{
QString dataStr = ui->textEdit->document()->toPlainText();
QByteArray datagram;
datagram.append(dataStr);
udp->writeDatagram( datagram, QHostAddress::Broadcast, 7878); //发送数据
}
QHostAddress::Broadcast //特殊的广播地址,意味着所有主机,但不是互联网上的所有主机
UDP接收端
class Udp_Recevier : public QWidget
{
Q_OBJECT
public:
explicit Udp_Recevier(QWidget *parent = 0);
~Udp_Recevier();
void processDatagram(void);
void initSocket(void);
private:
Ui::Udp_Recevier *ui;
QUdpSocket *udp;
};
#include "udp_recevier.h"
#include "ui_udp_recevier.h"
#include <QNetworkDatagram>
Udp_Recevier::Udp_Recevier(QWidget *parent) :
QWidget(parent),
ui(new Ui::Udp_Recevier)
{
ui->setupUi(this);
setWindowTitle(tr("UDP接收者"));
initSocket();
}
Udp_Recevier::~Udp_Recevier()
{
delete ui;
}
void Udp_Recevier::processDatagram()
{
while (udp->hasPendingDatagrams())
{
QNetworkDatagram datagram = udp->receiveDatagram(); //接收一个数据报
QString dataStr(datagram.data()); //将接收到的数据转换为QSting
ui->textBrowser->append(dataStr); //在textBrowser上显示接收到的数据
}
}
void Udp_Recevier::initSocket()
{
udp = new QUdpSocket(this);
//绑定端口号、地址 QUdpSocket::ShareAddress 允许其他服务绑定到相同端口地址
udp->bind(7878, QUdpSocket::ShareAddress);
connect(udp, &QUdpSocket::readyRead, this, &Udp_Recevier::processDatagram);
}
结果:
扫描二维码关注公众号,回复:
11654819 查看本文章