udp通信服务器广播消息,Qt之UDP的网络广播例子

UDP 用户数据报协议,是一种轻量级、无连接,不可靠,数据报的传输层协议。

一般用在短消息、广播消息等中,本文中是用在广播定时发送消息中。

注意还是要在.pro中加入 QT += network

广播定时发送给用户数据:

1、UDP的服务器端

先创建一个QUdpSocket对象,再创建一个定时器QTimer每秒发送一次数据,

最后利用QUdpSocket的writeDatagram()函数来设置地址和绑定端口来发送数据。

2、UDP的客服端

创建一个绑定好端口的QUdpSocket对象,此时最重要的一句话

connect(udpSocket,SIGNAL(readyRead()),this,SLOT(dataReceived()));

//其中dataReceived是自定义的函数,接受数据函数

当QUdpSocket对象每次要读入一个新数据的时候,就发送信号readyRead();

再来就是编写我们自定义的接受数据函数了,利用QUdpSocket的readDatagram()函数即可获取数据。

截图:

130376537_1_20180416035844785.JPG

服务端:

#ifndef UDPSERVER_H

#define UDPSERVER_H

#include 

class QLabel;

class QLineEdit;

class QUdpSocket;

class UdpServer: public QDialog

{

Q_OBJECT

private:

int port;

bool isStarted;

QUdpSocket *udpSocket;

QTimer *timer;

QLabel *timerLabel;

QLineEdit *contEdit;

QPushButton *startButton;

public:

UdpServer(QWidget *parent = 0);

private slots:

void slotStartButton();

void timeoutDo();

};

#endif // UDPSERVER_H

#include "udpserver.h"

#include 

#include 

UdpServer::UdpServer(QWidget *parent)

: QDialog(parent)

{

port = 5555;

isStarted = false;

udpSocket = new QUdpSocket(this);

timer = new QTimer(this);

//设置定时器,当时间到的时候就调用timeoutDo()槽

connect(timer, SIGNAL(timeout()), this, SLOT(timeoutDo()));

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));

timerLabel = new QLabel(tr("定时发送"));

contEdit = new QLineEdit;

startButton = new QPushButton(tr("开始"));

connect(startButton, SIGNAL(clicked()),

this, SLOT(slotStartButton()));

QVBoxLayout *mainLayout = new QVBoxLayout;

mainLayout->addWidget(timerLabel);

mainLayout->addWidget(contEdit);

mainLayout->addWidget(startButton);

setLayout(mainLayout);

setWindowTitle(tr("UDP Server"));

}

void UdpServer::slotStartButton()

{

if(false == isStarted) {

startButton->setText(tr("停止"));

isStarted = true;

timer->start(1000);

}

else {

startButton->setText(tr("开始"));

isStarted = false;

timer->stop();

}

}

void UdpServer::timeoutDo()

{

QString msg = contEdit->text();

int length = 0;

if("" == msg)

return ;

else if((length = udpSocket->writeDatagram(

msg.toLatin1(), msg.length(),

QHostAddress::Broadcast, port)) != msg.length()) {

return ;

}

}

#include "udpserver.h"

#include 

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

UdpServer *server = new UdpServer;

server->show();

return app.exec();

}

//客服端:

#ifndef UDPCLIENT_H

#define UDPCLIENT_H

#include 

class QTextEdit;

class QUdpSocket;

class UdpClient: public QDialog

{

Q_OBJECT

private:

int port;

QUdpSocket *udpSocket;

QTextEdit *showText;

QPushButton *closeButton;

public:

UdpClient(QWidget *parent = 0);

private slots:

void slotClose();

void dataReceived();

};

#endif // UDPCLIENT_H

#include "udpclient.h"

#include 

#include 

UdpClient::UdpClient(QWidget *parent)

: QDialog(parent)

{

port = 5555;

udpSocket = new QUdpSocket(this);

bool result = udpSocket->bind(port);

if(!result) {

QMessageBox::information(this, tr("error"),

tr("udp socket create error!"));

return ;

}

connect(udpSocket, SIGNAL(readyRead()),

this, SLOT(dataReceived()));

showText = new QTextEdit;

showText->setReadOnly(true);

closeButton = new QPushButton(tr("Close"));

connect(closeButton, SIGNAL(clicked()),

this, SLOT(slotClose()));

QVBoxLayout *mainLayout = new QVBoxLayout;

mainLayout->addWidget(showText);

mainLayout->addWidget(closeButton);

setLayout(mainLayout);

setWindowTitle(tr("UDP Client"));

}

//private slots

void UdpClient::slotClose()

{

udpSocket->close();

}

void UdpClient::dataReceived()

{

while(udpSocket->hasPendingDatagrams()) {

QByteArray datagram;

datagram.resize(udpSocket->pendingDatagramSize());

udpSocket->readDatagram(datagram.data(), datagram.size());

showText->insertPlainText(datagram.data());

}

}

#include "udpclient.h"

#include 

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

UdpClient *client = new UdpClient;

client->show();

return app.exec();

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值