由于项目的环境实在局域网内进行传输,所以采用了UDP通信。为此记录一下。

UDP概念

UDP(用户数据报协议)是一个简单的面向数据报的传输层协议。提供的是非面向连接的、不可靠的数据流传输。UDP不提供可靠性,也不提供报文到达确认、排序以及流量控制等功能。它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。因此报文可能会丢失、重复以及乱序等。但由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

UDP传输方式

UDP有单播、广播、组播
只有UDP有广播和多播, TCP只能进行点对点的单播, 多播的重点是高效的把同一个包尽可能多的发送到不同的,甚至可能是未知的设备。但是TCP连接是一对一明确的,只能单播。

文中涉及到所有的代码下载地址

代码下载。这里有文章中所有的代码。如果没有积分可以私聊我发你。

单播

服务端(发送者)

服务器端不需要绑定。只需要在发送时指定对方IP以及端口即可。

m_sender->writeDatagram(dataGram.data(),// 发送内容dataGram.size(),// 发送长度QHostAddress("192.168.0.108"),  // 对方IP6666);//对方端口

客户端(接收者)

客户端需要提前将本地IP和对应的端口进行绑定。然后关联readyRead信号。进行对应的实时读取。
下面这段代码是提前进行绑定和对应的信号槽关联

    groupAddress = QHostAddress("192.168.0.112");         // 本地地址int port1 = 6666;                                                   // 本地端口bool ret = m_receiver->bind(groupAddress,port1,QUdpSocket::ShareAddress);if(ret == false){QMessageBox::warning(this,"error", "绑定失败");}//当接收端接收到数据时,就会发送readRead信号connect(m_receiver,&QUdpSocket::readyRead,this,&ReceiverWidget::processData);

下面这段代码是槽函数的一个实时读取并显示在标签上。

void ReceiverWidget::processData()
{QString strData;//有未处理的数据报while(m_receiver->hasPendingDatagrams()){QByteArray dataGram;//读取的数据报大小dataGram.resize(m_receiver->pendingDatagramSize());m_receiver->readDatagram(dataGram.data(),dataGram.size());ui->textBrowser->insertPlainText(dataGram);   //将接收到的数据显示到标签上ui->textBrowser->insertPlainText("\n");   //将接收到的数据显示到标签上}
}

效果图

组播

组播相当于是在广播的基础上在加入组播。

服务端(发送者)

服务器端不需要绑定。只需要在发送时指定对方IP以及端口即可。

    m_sender=new QUdpSocket(this);QByteArray dataGram= ui->lineEdit->text().toUtf8();QHostAddress appaddr;m_sender->writeDatagram(dataGram.data(),dataGram.size(),QHostAddress("224.0.0.0"),// 组播地址7755);

客户端(接收者)

客户端需要对应的端口进行绑定。并加入到组播地址中,然后关联readyRead信号。进行对应的实时读取。
下面这段代码是提前进行绑定、加入组并关联信号和槽

    groupAddress = QHostAddress("224.0.0.0");         // 组播地址port = 7755;m_receiver = new QUdpSocket(this);bool aa = m_receiver->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);if(false == aa){qDebug() << "绑定失败!";}// 加入组播bool cc = m_receiver->joinMulticastGroup(groupAddress);if(false == cc){qDebug() << "加入组播失败!";}//当接收端接收到数据时,就会发送readRead信号connect(m_receiver, &QUdpSocket::readyRead, this, &ReceiverWidget::processData);

下面这段代码是槽函数的一个实时读取并显示在标签上。

void ReceiverWidget::processData()
{QString strData;//有未处理的数据报while(m_receiver->hasPendingDatagrams()){QByteArray dataGram;//读取的数据报大小dataGram.resize(m_receiver->pendingDatagramSize());m_receiver->readDatagram(dataGram.data(),dataGram.size());ui->textBrowser->insertPlainText(dataGram);   //将接收到的数据显示到标签上ui->textBrowser->insertPlainText("\n");   //将接收到的数据显示到标签上}
}

效果图

广播

广播只需要绑定端口即可。

服务器(发送者)

不需要绑定。发送时仅确定端口即可。

QByteArray dataGram= ui->lineEdit->text().toUtf8();
m_sender->writeDatagram(dataGram.data(),dataGram.size(),QHostAddress::Broadcast,7755);

客户端(接收者)

需要绑定所有的Ip地址(AnyIPv4)以及对应的端口。然后关联readyRead信号。进行对应的实时读取。
下面这段代码是提前进行绑定和对应的信号槽关联。
下面这段代码是提前进行绑定和对应的信号槽关联

    port = 7755;m_receiver = new QUdpSocket(this);bool aa = m_receiver->bind(QHostAddress::AnyIPv4, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);if(false == aa){qDebug() << "绑定失败!";}//当接收端接收到数据时,就会发送readRead信号connect(m_receiver, &QUdpSocket::readyRead, this, &ReceiverWidget::processData);

下面这段代码是槽函数的一个实时读取并显示在标签上。

void ReceiverWidget::processData()
{QString strData;//有未处理的数据报while(m_receiver->hasPendingDatagrams()){QByteArray dataGram;//读取的数据报大小dataGram.resize(m_receiver->pendingDatagramSize());m_receiver->readDatagram(dataGram.data(),dataGram.size());ui->textBrowser->insertPlainText(dataGram);   //将接收到的数据显示到标签上ui->textBrowser->insertPlainText("\n");   //将接收到的数据显示到标签上}
}

效果图

Qt网络编程之搭建Udp通信【单播、组播、广播】相关推荐

  1. Qt网络编程-简易版UDP组播通信入门Demo(5)

    Qt网络编程-简易版UDP组播通信入门Demo(5)

  2. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  3. 【QT网络编程】实现UDP协议通信

    文章目录 概要:本期主要讲解QT中对UDP协议通信的实现. 一.UDP协议通信 二.Qt中UDP协议的处理 1.QUdpSocket 三.Qt实现UDP通信 1.客户端 2.服务器端 结尾 概要:本期 ...

  4. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...

  5. 网络编程传输层——UDP通信

    何为传输层?         在物理层.数据链路层.网络层解决了主机和主机之间能够发送接收数据,但是在计算机网络中,主机的通信主体还是进程,而传输层则解决应用进程的通信,所谓传输层协议也是端对端协议. ...

  6. Java网络编程之简单UDP通信

    UDP是一种基于不可靠连接的协议,它无法保证传输的数据能不丢失不重复到达,尽自己努力传输,但是不会重传,不需要建立连接,则它所需要的时间会很快.它是基于数据报为单位进行传输的,不想TCP是一种基于流进 ...

  7. UDP单播 组播 广播 区别及简单实现

    无论是tcp还是udp 服务器都必须绑定prot.Ip,客户端可以有选择性. udp单播: 单播只能是发送方往接收方指定的IP 端口发送数据 组播需具备的条件  1.接收方设置组播属性及组播号  2. ...

  8. 单播,组播,广播概念

    单播(unicast): 是指封包在计算机网络的传输中,目的地址为单一目标的一种传输方式.它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议. 组播(mul ...

  9. 单播 组播 广播的区别

    单播:1:1 一对一,例如qq单聊 unicast 组播:1:6 一对一组 例如qq讨论组 multicast(多播) 广播:1:100 一对所有 例如qq 群发群聊 broadcast 任播(任意播 ...

最新文章

  1. :before和::before的区别
  2. java log4j mysql_java – log4j:MySQL的JDBCAppender错误
  3. html设置表格平分,如果未知数量,如何在HTML表格中均匀分配列宽?
  4. 直播预告 | 东南大学周张泉:基于知识图谱的推理技术
  5. 搭建linux软件仓库,创建自己的YUM仓库
  6. 关于SQL优化这些你了解吗?
  7. 软件质量保证划重点期末复习总结
  8. linux 延时一微秒_让我们暂停一微秒
  9. 这些新技术你们都知道吗?成功收获美团,小米安卓offer
  10. 数字信号处理——巴特沃斯滤波器设计
  11. nodejs实践录:pm2实验测试记录
  12. 详解MATLAB之MAX函数
  13. 10分钟学会发送邮件到指定邮箱
  14. onblur属性详解
  15. 大数据剖析 | 薪资没那么高,延毕率超60%,现代人读博都图什么?
  16. emmc/ufs, sd
  17. Wireshark分析流量包案例
  18. 从超融合到混合云,深信服有了哪些新“畅想”?
  19. 婚姻介绍所怎么做身份实名认证?
  20. Web3.0世界知识体系分享-Web3.0基本载体(NFT)

热门文章

  1. 创客教育在中小学的实施策略
  2. macos 下制作 windows 安装盘的教程
  3. Android之九宫格抽奖及大转盘抽奖
  4. 抗增殖活性天然产物分子机制研究——药物靶点预测系统案例分析3
  5. 初探技术管理(5)-管理沟通
  6. [附源码]计算机毕业设计JAVA每课三分钟教学资源管理系统
  7. 好莱坞洞穴重现“小宇宙”,投影技术创造极致体验
  8. java调sqlloader,Java调用SqlLoader将大文本数据导入数据库
  9. 在命令行窗口运行Java程序
  10. matlab projinv,有没有大神救救孩子?