QUdpSocket通信简易实例

2024-01-29 17:38

本文主要是介绍QUdpSocket通信简易实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

QUdpSocket通信简易实例

为了避免千篇一律,在本文中我只介绍我在使用QUdpSocket的使用体会,作为一个备忘录。
Udp通信和Tcp最大的不同就是基于无连接的通信,有点像是村里面的广播,我在广播里面说话,你不一定听到了(你可能带着耳机在听歌),但是我默认你听到了(毕竟我说的那么大声,而且还是全村的广播)。所以和Tcp通信,在应用层次的感受就是,以往Tcp可能有Server以及Client主次之间的区别,原因主要是因为建立连接的主次之分;而Udp就没有服务器和客户端之前的差别,大家都可以在广播里面说话,也都可以在家里听广播,所以只有Sender以及Reciver的区别。下面是关于QUdpSocket通信简易实例代码,分为Sender以及Reciver:

Sender:

由于是简易实例,设置成为发送一条消息就退出:
QT工程的pro文件中添加

QT += network

UdpSenderCmd.h

#ifndef UDPSENDERCMD_H
#define UDPSENDERCMD_H#include "QPushButton"
#include "QLineEdit"
#include <QWidget>
#include <QUdpSocket>class SendWIdgetCmd
{
public:SendWIdgetCmd();~SendWIdgetCmd();void slo_sendMessge(std::string param);private:QUdpSocket * sender;
};
#endif // UDPSENDERCMD_H

UdpSenderCmd.cpp

#include "UdpSenderCmd.h"#include <QHBoxLayout>
#include <QTextCodec>SendWIdgetCmd::SendWIdgetCmd()
{// 初始化sender = new QUdpSocket();
}SendWIdgetCmd::~SendWIdgetCmd()
{delete sender;
}void SendWIdgetCmd::slo_sendMessge(std::string param)
{QString string = QString::fromStdString(param);// 获取输入的内容qDebug() << string;/*发送数据* 第一个参数:要发送的内容,这里是要发送输入框的内容,*             参数没有QString类型,需要转换为QByteArray类型或Char*类型* 第二个参数:要发送到的目标IP地址,这里是本机测试,所以用LocalHost* 第三个参数:要发送的的目标端口,自己随意指定* 返回值:发送成功返回发送的字节数,失败返回-1*/int w = sender->writeDatagram(string.toLocal8Bit(),QHostAddress::LocalHost,8179);// 判断是否发送成功if(w == -1){qDebug() << "发送失败!";}else{qDebug() << "发送成功,字节数:" << w;}
}

main.cpp

#include"UdpSenderCmd.h"
int main(int argc, char *argv[])
{SendWIdgetCmd s;std::string msg = "this is a test message";s.slo_sendMessge(msg);}

Reciver:

由于Reciver需要循环等待,可以使用QT提供的信号与槽函数完美契合,所以代码会些微的复杂一些
值得注意的是需要在工程中的pro文件中添加:

QT += network
QT +=widgets

UdpReciver.h

#ifndef UDPRECIVER_H
#define UDPRECIVER_H#include <QWidget>
#include <QPlainTextEdit>
#include <QUdpSocket>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = 0);~Widget();
private slots:void slo_receiveMeaage();private:QPlainTextEdit * showMessage;QUdpSocket * receiver;};
#endif // UDPRECIVER_H

UdpReciver.cpp

#include "UdpReciver.h"#include <QDebug>
#include <QTextCodec>Widget::Widget(QWidget *parent): QWidget(parent)
{// 创建显示消息的文本框showMessage = new QPlainTextEdit(this);// 设置文本框只读showMessage->setReadOnly(true);// 设置文本框初始大小showMessage->resize(300,200);// 创建UDP套接字receiver = new QUdpSocket(this);// 绑定接收信息的IP和端口receiver->bind(QHostAddress::LocalHost,8179);// 关联readyRead信号(每当有新的数据可以从设备的当前读取通道读取时,这个信号就会发出一次)connect(receiver,&QUdpSocket::readyRead,this,&Widget::slo_receiveMeaage);
}Widget::~Widget()
{delete showMessage;delete receiver;
}void Widget::slo_receiveMeaage()
{// 用于存储接收到的数据QByteArray message;// 循环读取接收的数据,如果至少有一个数据报等待读取,些函数返回 true,否则返回 false。while (receiver->hasPendingDatagrams()){// 动态设置大小为第一个挂起的 udp 数据包的大小message.resize(receiver->pendingDatagramSize());/* 接收数据* 第一个参数:存储接收到数据* 第二个参数:接收的数据最大的大小* 返回值:成功返回接收的数据字节数,失败返回-1*/int r = receiver->readDatagram(message.data(),message.size());// 判断是否接收成功if(r == -1){qDebug() << "接收数据失败";}else{qDebug() << "接收数据成功";}}//指定编码方式,否则如果数据中出现中文,会出现乱码情况QTextCodec *codec = QTextCodec::codecForName("GBK");QString string = codec->toUnicode(message);qDebug() << string;// 将编码后的数据显示到文本框中showMessage->appendPlainText(string);
}

main.cpp

#include <QApplication>
#include "UdpSender.h"
int main(int argc, char *argv[])
{QApplication a(argc, argv);SendWIdget s;s.setWindowTitle("send");s.show();return a.exec();
}

运行截图:
运行截图
懒得搞得这里有现成的资源:
UdpSender
UdpReciver

这篇关于QUdpSocket通信简易实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657665

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.

springboot项目中集成shiro+jwt完整实例代码

《springboot项目中集成shiro+jwt完整实例代码》本文详细介绍如何在项目中集成Shiro和JWT,实现用户登录校验、token携带及接口权限管理,涉及自定义Realm、ModularRe... 目录简介目的需要的jar集成过程1.配置shiro2.创建自定义Realm2.1 LoginReal

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态