一 UDP介绍

UDP是一种简单轻量级的传输层协议,提供无连接的,不可靠的报文传输。适合下面4种情况:

网络数据大多为短消息。

拥有大量客户端。

对数据安全性无特殊要求

网络负担非常重,但对响应速度要求高。

二 基于udp协议的c/s编程模型(广播),组播的话,明天再看。

客户端:

class Sender : public QObject
{
Q_OBJECT //可以使用信号和槽
public:
explicit Sender(QObject *parent = );
~Sender();//虚构函数无返回值
void start();
public slots:
void broadcastDatagram(); private:
QUdpSocket *udpSocket;//包含 <QtNetwork/qudpsocket.h>
QTimer *timer;
int messageNo; };

在使用udp tcp时,qt的.pro文件中要加上 QT    +=network.

具体实现:

#include "sender.h"

Sender::Sender(QObject *parent) :
QObject(parent)
{
timer = new QTimer(this);
udpSocket = new QUdpSocket(this);
connect(timer,SIGNAL(timeout()),this,SLOT(broadcastDatagram()));
messageNo = ;
}
void Sender::start()
{
timer->start();
}
void Sender::broadcastDatagram()
{
qDebug()<<(tr("Begin Broadcast: %1").arg(messageNo));
QByteArray datagram = "BroadCast Message:" + QByteArray::number(messageNo);
udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,);
++messageNo;
} Sender::~Sender()
{
delete timer;
delete udpSocket;//是否删除connect? }

  udpSocket->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,44444);
函数原型:writeDatagram(const char* data,qint64 size,const QHostAddress &address,quint16 port)
函数功能:将数据包发出
函数参数:数据包自身,数据包大小,发送到的地址,端口。

接收端:

class Receiver : public QObject
{
Q_OBJECT
public:
explicit Receiver(QObject *parent = );
~Receiver();
signals: public slots:
void processPendingDatagrams();
private:
QUdpSocket *udpSocket; };

具体实现:

#include "receiver.h"

Receiver::Receiver(QObject *parent) :
QObject(parent)
{
udpSocket = new QUdpSocket(this);
udpSocket->bind();
connect(udpSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
}
void Receiver::processPendingDatagrams()
{
while(udpSocket->hasPendingDatagrams())
{
QByteArray datagram;
datagram.resize(udpSocket->pendingDatagramSize());
udpSocket->readDatagram(datagram.data(),datagram.size());
qDebug() << (tr("Receice Data: \"%1\"").arg(datagram.data()));
}
}
Receiver::~Receiver()
{
delete udpSocket;
}

当接受到数据包时,QUdpSocket会发出readyRead()信号。我关联了processPendingDatagrams()。

先用hasPendingDatagrams()判断是否有可供读取的数据。若有,则用pendingDatagramSize()开辟一个缓冲区。

最后,用readDatagram()将报文读取到缓冲区中。

最新文章

  1. padding标准盒模型和怪异盒子模型
  2. 大数据系列(5)——Hadoop集群MYSQL的安装
  3. Map小结
  4. 第二课 less的学习以及移动端需要注意的问题
  5. javascript关于闭包变量作用域
  6. C# params object[] args 可以传多个参数,可以不限制类型(转)
  7. Java 炫舞按键功能 DancingPlay (整理)
  8. Android性能优化之如何避免Overdraw
  9. 自定义Web控件写事件
  10. SQL Server 2005无法远程连接的解决方法
  11. 用php+ajax新建流程(请假、进货、出货等)
  12. 最近一直在做java爬虫,有些感悟心得,分享给大家;
  13. Shell编程之文本处理
  14. Dockerfile中CMD和ENTRYPOINT的区别
  15. ●BZOJ 2154 Crash的数字表格
  16. C#工具:分词辅助类
  17. Make a Person 闭包
  18. 关键字(5):cursor游标:(循环操作批量数据)
  19. Hadoop记录-Hadoop jmx
  20. Python3学习笔记04-运算符

热门文章

  1. 微信小程序iOS下拉白屏晃动,坑坑坑
  2. PHP删除字符串中的空格和换行符 将字符串中的连续多个空格转换为一个空格
  3. kubernetes资源清单之pod
  4. main特别之处
  5. task_struct原码解读
  6. Linux下计划任务:crontab 命令的权限说明
  7. Python3.8新特性--PositionalOnly参数
  8. LeetCode3.无重复字符的最大子串
  9. 【ARC072 E】Alice in linear land
  10. Nuxt 服务端渲染