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

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

java图像识别工具类(ImageRecognitionUtils)使用实例详解

《java图像识别工具类(ImageRecognitionUtils)使用实例详解》:本文主要介绍如何在Java中使用OpenCV进行图像识别,包括图像加载、预处理、分类、人脸检测和特征提取等步骤... 目录前言1. 图像识别的背景与作用2. 设计目标3. 项目依赖4. 设计与实现 ImageRecogni

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6