首页 > 编程语言 >QT-UDP网络编程

QT-UDP网络编程

时间:2023-10-09 15:26:48浏览次数:44  
标签:UDP 组播 QT 编程 单播 msg udpsocket socket

QT_UDP网络编程

用户数据报协议(UDP,User Datagram Protocol );

轻量的,不可靠,无连接,面向数据报的传输协议


与TCP,特征:

UDP通信在本质上不需要区分客户端和服务端,拥有socket的一方本身具有发送和接收数据报的能力.

QUdpSocket继承于父类的QAbstractSocket,没有QTcpSocket的流功能函数

在通信方式上不同于TCP的连接,UDP通信分为单播,广播,组播.

单播与建立连接的TCP的一对端类似,是一对一的通信,需要知晓双方的网络ip和port才能交换数据.

广播在同一互联网域(一般为局域网)内,当绑定的ip内有广播数据报,所有端都可以接收数据报内容.

组播类似群聊,在互联网域内进行分组,只有同一个分组的端能够发送和接收数据报内容.


连接方式/步骤:

//进入UDP通信环节的整体步骤
{
	QUdpsocket *udpsocket = new QUdpsocket(this);	//创建已窗体类本身为父类的socket

	connect(udpsocket,&QUdpsocket::stateChanged,this,&MainWindow::do_stateChanged);	//绑定该socket与窗体类状态改变信号的槽函数
	connect(udpsocket,SIGNAL(readyRead()),this,SLOT(do_socketReadyRead()));	//readyRead信号在socket确认有数据传入时发送,绑定do_socketReadyRead函数处理
}

{
    //绑定该客户端窗口监听的本地端口号
    udpsocket->bind(port);
    
    //本地客户端解绑方式
    udpsocket->absort();
    
}

{
    //单播方式的消息发送流程
    QHostAddress targetAddress(targetIP);	//目标通信对象的IP地址(QString)转换为QHostAddress格式
    
    QByteArray msg_to_send = msg.toUtf8();	//需要交换的数据报信息,此处为字符信息,转换为utf8的bytearray
    
    udpsocket.writeDatagram(msg_to_send,targetAddress,targetPort);	//socket单播方式发送数据报
}

{
    //广播方式的消息发送流程
    QByteArray msg_to_send = msg.toUtf8();
    
    udpsocket.writeDatagram(msg_to_send,QHostAddress::Broadcast,targetPort);	//socket广播方式发送数据报,无需指定targetAddress
}

do_ReadyRead
{
    //单播与广播的消息接收流程
    while(udpsocket->hasPendingDatagram())
    {
		QByteArray datagram;	//创建数据接收载体
        datagram.resize(udpsocket->pendingDatagramSize());	//根据数据大小调整载体大小
        QHostAddress peerAddr;	//对方地址
        quint16 peerPort;	//对方端口
        udpsocket->readDatagram(datagram.data(),datagram.size(),&peerAddr,&peerPort);	//指定必需的数据内容存放处及其大小供写入,接收可选参数对方地址和端口.
        QString data = datagram.data();	//获取存放的信息数据
    }
}

//省略 do_stateChanged() 函数编写部分

//组播方式变更的地方
{
	udpsocket = new QUdpsocket(this);
    //↓
    udpsocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);//设置udp通信方式为组播且ttl(生存周期)为一个路由器跳转内,实现局域网组播通信
    
    //加入组播的方式
    if(udpsocket->bind(QHostAddress::AnyIPv4,groupPort,QUdpSocket::ShareAddress))//绑定局域网内任何IPv4协议的网络地址,port为组播的统一端口,ShareAddress允许其他服务使用这个地址和端口,是该模式下mode的必填项
    {
		udpsocket->joinMulticastGroup(groupAddress);	//加入组播组
        
        udpsocket->leaveMulticastGroup(groupAddress);	//离开组播组
    }
    
    //发送信息的参数填写
    udpsocket->writeDatagram(datagram,groupAddress,groupPort);
    //读取信息代码与单播和广播一致
}

与TCP相同的信号绑定部分,总体来说先学习UDP通信会更便于理解TCP连接通信

标签:UDP,组播,QT,编程,单播,msg,udpsocket,socket
From: https://www.cnblogs.com/NekoBlog/p/17751797.html

相关文章

  • QT之QWidget::paintEngine: Should no longer be called的解决办法
    这个还是以前遇到的,今天突然想起来,就决定重现一下当初的错误,以及错误的代码。报错是这个样子的:QWidget::paintEngine:ShouldnolongerbecalledQPainter::begin:Paintdevicereturnedengine==0,type:1其实这个原因很简单,来看看报错的代码:#include"mainwindow.h"......
  • 22-Vue组件化编程
    使用传统的方式编写应用传统的方式,一般离不开前端的三大件(HTML、CSS、JS)HTML:HTML是超文本标记语言(HyperTextMarkupLanguage)是用来描述网页的一种语言,负责网页的架构CSS:CSS是一种层叠样式表(级联样式表、样式表),是⼀种标记语⾔,负责网页的样式,美化JavaScript(JS):JS是运行在客户......
  • 编程语言在线编辑器编译器IDE
     C语言在线编辑器编译器IDEhttp://codepad.org/ C#语言在线编辑器编译器IDEhttp://www.dooccn.com/csharp/ C++语言在线编辑器编译器IDEhttp://www.dooccn.com/cpp/ Java语言在线编辑器编译器IDEhttp://www.dooccn.com/java/  Python语言在线编辑器编译器IDEhttp://codepad.o......
  • PyQT5 PyQT入门教程(之三)
    REFhttp://code.py40.com/pyqt5/22.html 事件Event所有的GUI程序都是事件驱动的。事件主要由用户触发,但也可能有其他触发方式:例如网络连接、windowmanager或定时器。当我们调用QApplication的exec_()方法时会使程序进入主循环。主循环会获取并分发事件。在事件模型中,有三个参与......
  • PyQT5 PyQT入门教程(之二)
    REFhttps://www.jianshu.com/p/3832eb48f3d5 布局(Layout)管理QtDesigner中,在工具箱中最上方可以看到有4种布局。分别是垂直布局、水平布局、栅格布局和表单布局。  四种布局布局名称   布局含义垂直(Vertical)布局   布局内的控件按照从上到下的顺序纵向排列水平(Horizon......
  • PyQT5 PyQT入门教程(之一)
    REFhttps://www.jianshu.com/p/5b063c5745d0 本篇博客对应的视频讲解:https://www.bilibili.com/video/BV1NZ4y1Z7ue/ QtDesigner的介绍在PyQt中编写UI界面可以直接通过代码来实现,也可以通过QtDesigner来完成。QtDesigner的设计符合MVC的架构,其实现了视图和逻辑的分离,从而实现......
  • Stream流式编程,让代码变优雅
    一、引言流式编程的概念和作用Java流(Stream)是一连串的元素序列,可以进行各种操作以实现数据的转换和处理。流式编程的概念基于函数式编程的思想,旨在简化代码,提高可读性和可维护性。JavaStream的主要作用有以下几个方面:简化集合操作:使用传统的for循环或迭代器来处理集合......
  • Java-网络编程(TCP-UDP)
    Java-网络编程(TCP-UDP)网络基础网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开......
  • C++提高编程
    C++提高编程本文主要针对C++泛型编程和STL技术做详细讲解,探讨C++更深层的使用1模板1.1模板的概念模板就是建立通用的模具,大大提高复用性例如生活中的模板一寸照片模板:PPT模板:模板的特点:模板不可以直接使用,它只是一个框架模板的通用并不是万能的1.2函数模板......
  • 《java编程语言》读后感
    读完《Java编程思想》这本书,我不禁对Java编程语言有了更深的认识和理解。这本书对Java的各个方面进行了详细的讲解,从基础知识到高级概念,从语法到设计模式,无一不涉及。通过阅读这本书,我不仅学到了很多Java的技术细节,还对软件开发的思想和方法有了更深入的了解。首先,这本书让我对Ja......