Qt网络编程——QUdpSocket

news2024/11/19 20:46:05

文章目录

    • Qt网络编程
    • QUdpSocket
      • Udp回显服务器
      • Udp客户端

Qt网络编程

网络编程本质上是写应用层代码,需要传输层提供支持。

而传输层最核心的协议就是UDP和TCP,这两个协议有较大差别,所以Qt提供了两套API。

要是有Qt网络编程的API,需要现在.pro文件当中添加network模块。

之前的各种控件,各种内容都是包含在QtCore模块当中的(默认添加)

为什么要划分模块?

Qt本身十分庞大,包含了很多框架,如果把所有的Qt功能放到一起,即是写一个简单的hello world,此时生成的可执行程序也会非常庞大。

比如说,Qt会应用到嵌入式,嵌入式系统的配置并没有那么高,所以对空间的利用 > 对时间的利用

进行模块化处理,在默认情况下,其他额外的模块不参与编译,用的时候在.pro文件中引入对应的模块,才能把对应功能给编译加载进来。

网络编程是操作系统提供的API,

C++标准库里面还未提供网络编程的api封装

QUdpSocket

名称类型说明原生API
bind(const QHostAddress&, quint16)方法绑定指定端口bind
receiveDatagram()方法返回QNetWorkDatagram
读取UDP数据报
recvfrom
writeDatagram(const QNetworkDatagram&)方法发送UDP数据报sendto
readyRead信号收到数据并准备就绪后触发无(类似与IO多路复用机制)

QNetWorkDatagram表示有个UDP数据报

名称类型说明原生API
QNetworkDatagram(const QByteArray&, const QHostAddress&, quint16)构造函数通过QByteArray,目标IP地址目标端口号,构造一个UDP数据报
通常用于发送数据时
data()方法获取数据报内部持有的数据
返回QByteArray
senderAddress()方法获取数据报中包含的对端IP地址无,recvfrom包含此类功能
senderPort()方法获取数据报中包含的对端的端口号无,recvfrom包含此类功能

Udp回显服务器

一般服务器都没有图形化界面,此处为了更加直观看到,采用图形化界面方式

ui界面:

image-20240924212556093

.pro引入network模块

image-20240924213217801

widget.h

这里需要包含QUdpSocket头文件,包含之后可能还是会显示报错,将程序重新编译运行一下即可

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QUdpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

    QUdpSocket* socket;

    void processRequest();
    QString process(const QString& request);
};
#endif // WIDGET_H

widget.cpp

构造对象的时候,参数可以是parent,也就是挂到对象树上(如果不写,之后手动delete即可)

image-20240925211236570

要线连接信号槽,再进行bind

一旦进行bind,就意味着请求可以收到了。

如果在连接信号槽之前bind,可能收到请求,而信号槽还没连接,此时请求就丢失了

#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QNetworkDatagram>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建实例
    socket = new QUdpSocket(this);  //可以挂到对象树

    //设置窗口标题
    this->setWindowTitle("udp服务器");

    //连接信号槽
    connect(socket, &QUdpSocket::readyRead, this, &Widget::processRequest);

    //绑定端口号
    //any表示不管几个网卡,都可以绑定上去
    if(!socket->bind(QHostAddress::Any, 8080))
    {
        QMessageBox::critical(this, "bind error", socket->errorString());
        return;
    }
}

Widget::~Widget()
{
    delete ui;
}

void Widget::processRequest()
{
    //读取请求并解析
    const QNetworkDatagram& requestDatagram = socket->receiveDatagram();
    //data()返回QByteArray  QBtyeArray可以赋值给QString
    QString request = requestDatagram.data();

    //根据请求计算(此时是回显服务器, 收到什么响应什么)
    const QString& response = process(request);

    //把响应写给客户端
    //取出字节数组 发送到的地址 发送到的端口 都包含在requestDatagram
    QNetworkDatagram responseDatagram(response.toUtf8(), requestDatagram.senderAddress(), requestDatagram.senderPort());
    socket->writeDatagram(responseDatagram);

    //交互的信息 显式到界面
    QString log = "[" + requestDatagram.senderAddress().toString() + ":" + QString::number(requestDatagram.senderPort()) +
            "] req:" + request + ", resp: " + response;

    ui->listWidget->addItem(log);
}

QString Widget::process(const QString &request)
{
    return request;
}

Udp客户端

Qt Creator支持同时打开多个项目,但如果姓名中存在同名文件,就非常容易混淆

image-20240924215956667

客户端主动发起请求,界面设置一个输入框,一个发送按钮,一个显示服务器返回内容

image-20240924220714547

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QUdpSocket>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked();
    void processResponse();
private:
    Ui::Widget *ui;
    QUdpSocket* socket;
};
#endif // WIDGET_H

widget.cpp

在Linux中,需要考虑一些阻塞问题,什么时候阻塞,什么时候解除阻塞。

而这里直接用信号槽机制,很方便。

#include "widget.h"
#include "ui_widget.h"
#include<QNetworkDatagram>
const QString SERVER_IP = "127.0.0.1";
const quint16 SERVER_PORT = 8080;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    socket = new QUdpSocket(this);
    //修改窗口标题
    this->setWindowTitle("客户端");

    //通过信号槽处理返回的数据
    connect(socket, &QUdpSocket::readyRead, this, &Widget::processResponse);

}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
    //获取输入框内容
    const QString& text = ui->lineEdit->text();

    //构造udp请求数据包
    //需要的参数是字节数组,要转换一下 IP地址也要转换一下
    QNetworkDatagram requestDatagram(text.toUtf8(), QHostAddress(SERVER_IP), SERVER_PORT);

    //发送请求数据
    socket->writeDatagram(requestDatagram);

    //发送的请求添加到列表框
    ui->listWidget->addItem("client say# " + text);

    //输入框内容清空
    ui->lineEdit->setText("");
}

void Widget::processResponse()
{
    //读取响应数据
    const QNetworkDatagram& responseDatagram = socket->receiveDatagram();
    QString response = responseDatagram.data();
    //响应到界面
    ui->listWidget->addItem("server say# " + response);
}

GIF 2024-9-25 21-31-21

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166248.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9.23-9.25学习

前置知识 docker&#xff1a;Docker-CSDN博客 docker安装mysql和 redis&#xff1a;https://blog.csdn.net/weixin_73118927/article/details/142530243?fromshareblogdetail&sharetypeblogdetail&sharerId142530243&sharereferPC&sharesourceweixin_7311892…

从预测性维护到智能物流:ARM边缘计算控制器的工业实践

工业4.0时代的到来&#xff0c;边缘计算技术成为连接物理世界与数字世界的桥梁。ARM架构的边缘计算控制器凭借其低功耗、高能效和灵活性等特点&#xff0c;在工业自动化领域展现出巨大潜力。本文将通过几个实际应用案例来探讨ARM边缘计算控制器是如何提升生产线效率和安全性的&…

03DSP学习-利用syscfg配置IO

上一篇博客介绍了syscfg&#xff0c;对syscfg有了初步的了解&#xff0c;但是在真正使用上它之前&#xff0c;还不能理解他是一个神器。 (在写博客的时候&#xff0c;我是在从头到尾重新完成这个步骤&#xff0c;希望对初学者有点帮助) 找到Board Component 打开syscfg文件&…

【Tourism】Yuncheng(4)

文章目录 1、永乐宫&#xff08;AAAA&#xff09;2、寿圣寺3、城隍庙4、池神庙 1、永乐宫&#xff08;AAAA&#xff09; 永乐宫&#xff0c;原名大纯阳万寿宫&#xff0c;位于山西省运城市芮城县以北约三公里处的龙泉村东&#xff0c;是为纪念八仙之一吕洞宾而修建的一座道教宫…

VR虚拟展厅可以在手机上打开吗?

虚拟展厅是可以在手机上打开的。 随着数字技术和虚拟现实技术的不断发展&#xff0c;虚拟展厅已经实现了多平台无缝对接&#xff0c;包括手机、平板、电脑等多种电子设备。具体来说&#xff0c;虚拟展厅通常采用HTML5360全景架构&#xff0c;这种架构使得虚拟展厅不需要安装任…

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具&#xff0c;软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容&#xff0c;流畅地…

2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU

1.配置时间2024/9/25 2.Anaconda-python版本3.7&#xff0c;yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…

vue路由的基本使用

文章目录 1.路由的基本使用2.路由的默认路径3.嵌套路由4.路由懒加载5.动态路由匹配 1.路由的基本使用 安装 vue-router&#xff1a; npm install vue-router创建路由文件&#xff1a; 在 src 目录下创建 router 目录&#xff0c;并在其中创建 index.js 文件。 在 main.js 中使…

【Linux操作系统】进程优先级

目录 一、为什么要有优先级二、进程优先级1.进程优先级的基本概念2.进程优先级的表现形式3. 默认优先级4.进程优先级的修改5.为什么调整优先级是要受限制的&#xff1f; 一、为什么要有优先级 在学习进程优先级之前&#xff0c;我们要先知道为什么会出现进程优先级这个东西 从…

2015年国赛高教杯数学建模A题太阳影子定位解题全过程文档及程序

2015年国赛高教杯数学建模 A题 太阳影子定位 技术就是通过分析视频中物体的太阳影子变化&#xff0c;确定视频拍摄的地点和日期的一种方法。   1.建立影子长度变化的数学模型&#xff0c;分析影子长度关于各个参数的变化规律&#xff0c;并应用你们建立的模型画出2015年10月…

C++入门day3-面向对象编程(下)

前言&#xff1a;C入门day3-面向对象编程&#xff08;中&#xff09;-CSDN博客 初识&#xff1a;继承特性 继承的基础语法 class A{ public:int a; }; class B:public A { public:int b; }; B类通过继承A类后&#xff0c;内部会继承一个int变量 a&#xff1a;从下图我们可以…

Nginx基础详解2(首页解析过程、进程模型、处理Web请求机制、nginx.conf语法结构)

续&#xff1a;Nginx基础详解1&#xff08;单体部署与集群部署、负载均衡、正反代理、nginx安装&#xff09;-CSDN博客 目录 4.Nginx默认首页的过程解析 5.Nginx进程模型的详解 5.1启动nginx后的关于nginx的进程查看 5.2master进程与process进程 5.3Nginx进程图解 5.4wo…

【已解决】【Hadoop】【./bin的使用】bash: ./bin/hdfs: 没有那个文件或目录

在 Hadoop 环境中&#xff0c;决定何时在命令前添加 ./bin 和如何处理路径 /home/hadoop 与 /usr/local/hadoop 的问题&#xff0c;主要取决于你的当前工作目录和环境变量的设置。以下是一些指导原则&#xff1a; 何时使用 ./bin&#xff1a; 当前目录是 Hadoop 安装目录&…

【分类|回归】深度学习中的分类和回归?离散数据or连续数值?

【分类|回归】深度学习中的分类和回归&#xff1f;离散数据or连续数值&#xff1f; 【分类|回归】深度学习中的分类和回归&#xff1f;离散数据or连续数值&#xff1f; 文章目录 【分类|回归】深度学习中的分类和回归&#xff1f;离散数据or连续数值&#xff1f;前言1.分类问题…

帆软通过JavaScript注入sql,实现数据动态查询

将sql语句设置为参数 新建数据库查询 设置数据库查询的sql语句 添加控件 JavaScript实现sql注入 添加事件 编写JavaScript代码 //获取评价人id var pjrid this.options.form.getWidgetByName("id").getValue();//显示评价人id alert("评价人&#xff1a;&…

单片机串口AT指令操作SIM800、900拨打电话

文章目录 一、前言1.1 功能简介1.2 拨打电话功能的应用场景1.3 SIM900A与SIM800C模块介绍1.4 原理图 三、模块调试3.1 工具软件下载3.2 准备好模块3.3 串口调试助手的设置3.4 初始化配置3.5 拨打电话的测试流程 四、代码实现4.1 底层的命令发送接口4.2 底层数据接收接口4.3 检测…

Cisco Packet Tracer的安装加汉化

这个工具学计算机网络的同学会用到 1.下载安装 网盘链接&#xff1a;https://pan.baidu.com/s/1CmnxAD9MkCtE7pc8Tjw0IA 提取码&#xff1a;frkb 点击第一个进行安装&#xff0c;按步骤来即可。 2.汉化 &#xff08;1&#xff09;复制chinese.ptl文件 &#xff08;2&…

四元组问题

目录 问题描述 输入格式 输出格式 样例输入 样例输出 说明 评测数据规模 运行限制 原题链接 代码思路 问题描述 从小学开始&#xff0c;小明就是一个非常喜欢数学的孩子。他喜欢用数学的方式解决各种问题。在他的高中时期&#xff0c;他遇到了一个非常有趣的问题&…

【Unity服务】如何使用Unity Version Control

Unity上的线上服务有很多&#xff0c;我们接触到的第一个一般就是Version Control&#xff0c;用于对项目资源的版本管理。 本文介绍如何为项目添加Version Control&#xff0c;并如何使用&#xff0c;以及如何将项目与Version Control断开链接。 其实如果仅仅是对项目资源进…

华盈伯乐 | Bio-Plex多重细胞因子检测技术培训及研讨会现场回顾

精彩华盈现场回顾 迎着朝霞&#xff0c;与会的伙伴们一早踏上了旅程&#xff0c;参与华盈生物与伯乐生命科学联合举办的Bio-Plex多重细胞因子检测技术培训及研讨会活动。随着活动的序幕缓缓拉开&#xff0c;我们迎来了一段充实而富有成效的学习之旅。 精彩开幕 华盈生物的副总…