当前位置: 首页 > news >正文

【QT网络】构建简单Udp回显服务器

📢博客主页:https://blog.csdn.net/2301_779549673
📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 🏳️‍🌈一、核心API概览
    • 1.1 QUdpSocket
    • 1.2 QNetworkDatagram
    • 1.3 Qt网络注意点
  • 🏳️‍🌈二、UdpServer 服务端
    • 2.1 界面布局
    • 2.2 QUdpSocket 成员
    • 2.3 processRequest 处理信号槽
    • 2.4 process 具体处理过程
    • 2.5 整体代码
  • 🏳️‍🌈三、UdpClient 客户端
    • 3.1 界面布局
    • 3.2 全局变量
    • 3.3 QUdpClient 成员
    • 3.3 on_pushButton_clicked 发送信号槽
    • 3.4 processResponse 响应报文处理槽
    • 3.5 整体代码
  • 🏳️‍🌈四、测试
  • 👥总结


🏳️‍🌈一、核心API概览

主要的类有两个.QUdpSocketQNetworkDatagram

1.1 QUdpSocket

QUdpSocket 表示一个 UDP 的 socket 文件

在这里插入图片描述

1.2 QNetworkDatagram

QNetworkDatagram 表示一个 UDP 的数据包
在这里插入图片描述

1.3 Qt网络注意点

在进行网络编程之前,需要在项目中的.pro 文件中添加 network 模块
在这里插入图片描述

🏳️‍🌈二、UdpServer 服务端

2.1 界面布局

创建界面,包含一个QListwidget 用来显示消息。不需要怎么调,只需要有一个能够回显出客户端数据的界面就行

在这里插入图片描述

2.2 QUdpSocket 成员

先需要在头文件中添加相应库和成员

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QUdpSocket>   // 需要引入networkQT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QUdpSocket* socket;			// 
};
#endif // WIDGET_H

然后我们需要在主函数中创建相应的对象

socket = new QUdpSocket(this);

这里不得不提醒一下,new的时候附带上this,这样就会将widget作为基类,等widget被销毁的时候,也会跟着销毁。不然就需要在widget的析构函数中带上 delete socket

Udp服务端的顺序

  1. 将服务端套接字连接到相应的处理信号槽上
  2. 绑定套接字到指定端口上,开始监听指定的ip

如果顺序反过来,可能会出现端口绑定好了之后,请求就过来了.此时还没来得及连接信号槽,那么这个请求就有可能错过了

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 创建出这个对象// socket = new QUdpSocket(this); 表示 socket 的父对象是当前 Widget 对象。当 Widget 析构时,会触发 socket 的自动销毁,无需手动 delete。// 如果改为 socket = new QUdpSocket;(无父对象),则 socket 的生命周期不再由 Widget 管理。此时必须手动调用 delete socket;,否则 socket 对象会一直存在,导致内存泄漏。socket = new QUdpSocket(this);// 设置窗口标题this->setWindowTitle("服务器");// 连接信号槽connect(socket, &QUdpSocket::readyRead, this, &Widget::processRequest);// 绑定端口号bool ret = socket->bind(QHostAddress::Any, 9090);if(!ret){// 绑定失败!QMessageBox::critical(this, "服务器绑定端口号失败", socket->errorString());return;}
}Widget::~Widget()
{delete ui;
}

这部分与linux网络是一样的,linux中要么选择在构造函数中将指定的方法回调函数传进去,要么选择使用udpserver对象的函数方法,设置方法回调函数。总而言之,都是先确定好方法回调函数,再去从外面不断收取连接

在这里插入图片描述

2.3 processRequest 处理信号槽

完成处理请求的过程

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应写回到客户端
// 这个函数完成的逻辑,就是服务器的最核心逻辑了
void Widget::processRequest()
{// 1. 读取请求并解析const QNetworkDatagram& requestDatagram = socket->receiveDatagram();QString request = requestDatagram.data();// 2. 根据请求计算相应(由于是回显服务器,相应不需要计算,就是请求本身)const QString& response = process(request);// 3. 把相应写回客户端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);
}

2.4 process 具体处理过程

由于我们此处是实现回显服务器.所以 process 方法中并没有包含实质性的内容

"根据请求处理响应"是服务器开发中的最核心的步骤一个商业服务器程序,这里的逻辑可能是几万行几十万行代码量级的

QString Widget::process(const QString &request)
{// 由于当前是会先服务器,相应就是和请求完全一样的return request;
}

2.5 整体代码

记得不要忘记在头文件中添加相应的槽函数声明

#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); 表示 socket 的父对象是当前 Widget 对象。当 Widget 析构时,会触发 socket 的自动销毁,无需手动 delete。// 如果改为 socket = new QUdpSocket;(无父对象),则 socket 的生命周期不再由 Widget 管理。此时必须手动调用 delete socket;,否则 socket 对象会一直存在,导致内存泄漏。socket = new QUdpSocket(this);// 设置窗口标题this->setWindowTitle("服务器");// 连接信号槽connect(socket, &QUdpSocket::readyRead, this, &Widget::processRequest);// 绑定端口号bool ret = socket->bind(QHostAddress::Any, 9090);if(!ret){// 绑定失败!QMessageBox::critical(this, "服务器绑定端口号失败", socket->errorString());return;}
}Widget::~Widget()
{delete ui;
}// 这个函数完成的逻辑,就是服务器的最核心逻辑了
void Widget::processRequest()
{// 1. 读取请求并解析const QNetworkDatagram& requestDatagram = socket->receiveDatagram();QString request = requestDatagram.data();// 2. 根据请求计算相应(由于是回显服务器,相应不需要计算,就是请求本身)const QString& response = process(request);// 3. 把响应写回客户端QNetworkDatagram responseDatagram(response.toUtf8(), requestDatagram.senderAddress(), requestDatagram.senderPort());socket->writeDatagram(responseDatagram);// 4. 把这次交互的信息,显示到界面上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;
}

🏳️‍🌈三、UdpClient 客户端

3.1 界面布局

创建界面:包含3个 QLineEditQPushButtonQListwidget

  • 先使用水平布局QLineEditQPushButton 放好,并设置这两个控件的垂直方向的sizePolicy 为Expanding
  • 再使用垂直布局QListwidget 和上面的水平布局放好
  • 设置垂直布局layoutStretch为5,1(当然这个尺寸比例根据个人喜好微调)

在这里插入图片描述
在这里插入图片描述

3.2 全局变量

widget.cpp 中,先创建两个全局常量,表示服务器的 IP端口

// 定义两个常量,描述服务器的地址和端口
const QString& SERVER_IP = "127.0.0.1";
const quint16 SERVER_PORT = 9090;

3.3 QUdpClient 成员

这个部分相对服务端简单一些。

  • 服务端 需要先连接处理信号槽再绑定端口号和指定ip
  • 客户端 只需要建立好与对 服务端响应内容相应的处理函数 的连接就行了
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;
}

3.3 on_pushButton_clicked 发送信号槽

在这里,我们的需要实现的功能只是 回显 ,所以只需要,lineedit 中的内容,序列化,与目标服务端的ip、端口号绑定起来。然后将一整个请求使用 writeDatagram 发送出去

void Widget::on_pushButton_clicked()
{// 1. 获取到输入框的内容const QString& text = ui->lineEdit->text();// 2. 构造 UDP 的请求数据QNetworkDatagram requestDatagram(text.toUtf8(), QHostAddress(SERVER_IP), SERVER_PORT);// 3. 发送请求数据socket->writeDatagram(requestDatagram);// 4. 把发送的数据也添加到列表框中ui->listWidget->addItem("客户端发送:" + text);// 5. 把输入框的内容也清空一些ui->lineEdit->setText(text);
}

3.4 processResponse 响应报文处理槽

简单回显即可

void Widget::processResponse()
{// 通过这个函数来处理收到的响应// 1. 读取到响应数据const QNetworkDatagram& responseDatagram = socket->receiveDatagram();QString response = responseDatagram.data();// 2. 把响应数据显示到界面上ui->listWidget->addItem("服务器响应: " + response);
}

3.5 整体代码

#include "widget.h"
#include "ui_widget.h"// 定义两个常量,描述服务器的地址和端口
const QString& SERVER_IP = "127.0.0.1";
const quint16 SERVER_PORT = 9090;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()
{// 1. 获取到输入框的内容const QString& text = ui->lineEdit->text();// 2. 构造 UDP 的请求数据QNetworkDatagram requestDatagram(text.toUtf8(), QHostAddress(SERVER_IP), SERVER_PORT);// 3. 发送请求数据socket->writeDatagram(requestDatagram);// 4. 把发送的数据也添加到列表框中ui->listWidget->addItem("客户端发送:" + text);// 5. 把输入框的内容也清空一些ui->lineEdit->setText(text);
}void Widget::processResponse()
{// 通过这个函数来处理收到的响应// 1. 读取到响应数据const QNetworkDatagram& responseDatagram = socket->receiveDatagram();QString response = responseDatagram.data();// 2. 把响应数据显示到界面上ui->listWidget->addItem("服务器响应: " + response);
}

🏳️‍🌈四、测试

可以看到成功回显了

在这里插入图片描述如果需要测试多个客户端的情况,可以在client的build目录下,找到exe文件,多次打开就行

在这里插入图片描述
可以发现两个客户端的端口号是不一样的

在这里插入图片描述


👥总结

本篇博文对 【QT网络】构建简单Udp回显服务器 做了一个较为详细的介绍,不知道对你有没有帮助呢

觉得博主写得还不错的三连支持下吧!会继续努力的~

相关文章:

【QT网络】构建简单Udp回显服务器

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

浅谈国产数据库多租户方案:提升云计算与SaaS的资源管理效率

近年来&#xff0c;“数据库多租户”这一概念在技术圈内频频出现&#xff0c;成为云计算和SaaS&#xff08;软件即服务&#xff09;架构中的重要组成部分。多租户架构不仅为企业提供了高效的资源隔离与共享解决方案&#xff0c;还能大幅降低成本&#xff0c;提高系统的可扩展性…...

【霍夫变换】图像处理(OpenCV)-part11

20 霍夫变换 20.1 理解霍夫变换 霍夫变换的基本思想是将图像空间中的几何元素&#xff08;如直线、圆等&#xff09;通过参数方程转换到参数空间中&#xff0c;形成一个参数空间的累加器数组。图像空间中的每个点在参数空间中对应一个曲线或曲面&#xff0c;而几何形状在图像…...

Flink 源码编译

打包命令 打包整个项目 mvn clean package -DskipTests -Drat.skiptrue打包单个模块 mvn clean package -DskipTests -Drat.skiptrue -pl flink-dist如果该模块依赖其他模块&#xff0c;可能需要先将其他模块 install 到本地&#xff0c;如果依赖的模块的源代码有修改&#…...

React19源码阅读之commitRoot

commitRoot入口 在finishConcurrentRender函数&#xff0c;commitRootWhenReady函数&#xff0c;commitRoot函数。 commitRoot流程图 commitRoot函数 commitRoot 函数是 React 渲染流程中用于提交根节点的关键函数。它的主要作用是设置相关的优先级和状态&#xff0c;然后调…...

单 例 模 式

设计模式&#xff08;Design Pattern&#xff09;说白了就是一套方法论&#xff0c;是我们的前辈们不断试错总结出来的。一般意义上的设计模式有23种&#xff0c;分为创建型、结构型、行为型三大类。今天先拿最简单的单例模式开刀吧。 六大原则 在正式进入设计模式的学习之前&…...

如何在 Postman 中,自动获取 Token 并将其赋值到环境变量

在 Postman 中&#xff0c;你可以通过 预请求脚本&#xff08;Pre-request Script&#xff09; 和 测试脚本&#xff08;Tests&#xff09; 实现自动获取 Token 并将其赋值到环境变量&#xff0c;下面是完整的操作步骤&#xff1a; ✅ 一、创建获取 Token 的请求 通常这个请求…...

CentOS 7 基于 Nginx 的 HTML 部署全流程指南

一、Nginx 安装&#xff08;两种主流方式&#xff09; 1. YUM 安装&#xff08;推荐新手&#xff09; # 安装 EPEL 扩展源&#xff08;部分系统需要&#xff09; yum install epel-release -y# 安装 Nginx yum install nginx -y# 启动并设置开机自启 systemctl start nginx s…...

spring-ai使用Document存储至milvus的数据结构

1、 spring:application:name: spring-ai-alibaba-rag-milvus-exampleai:dashscope:api-key: sk-xxxxxxoooooovectorstore:milvus:client:host: xxx.ooo.mmm.nnnport: 19530username: rootpassword: MilvusdatabaseName: defaultcollectionName: vector_store#初始化 collecti…...

Milvus(6):Collection 管理分区、管理别名

1 管理分区 分区是一个 Collection 的子集。每个分区与其父集合共享相同的数据结构&#xff0c;但只包含集合中的一个数据子集。本页将帮助你了解如何管理分区。 1.1 分区概述 创建一个 Collection 时&#xff0c;Milvus 也会在该 Collection 中创建一个名为_default 的分区。…...

关于Safari浏览器在ios<16.3版本不支持正则表达式零宽断言的解决办法

异常原因 今天在升级Dify版本的时候发现低版本的ios手机出现了以下报错&#xff1a; SyntaxError: Invalid regular expression: invalid group specifier nameError: Invalid regular expression: invalid group specifier name Call Stack 46 eval [native code] (0:0) ./n…...

设计模式--建造者模式详解

建造者模式 建造者模式也属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式 定义&#xff1a;将一个复杂对象的构建和它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示&#xff08;假设有不同的建造者实现类&#xff0c;可以产生不同的产品&#xff09…...

玩转Docker | Docker部署LMS轻量级音乐工具

玩转Docker | Docker部署LMS轻量级音乐工具 前言一、LMS介绍LMS简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署LMS服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问LMS服务访问LMS首页注册账号五、基本使用上传音乐文…...

【前端】【业务场景】【面试】在前端项目中,当涉及大量数据渲染时,如何提高渲染性能并避免页面卡顿?

大量数据渲染性能优化&#xff1a;四层进阶法 循序渐进&#xff1a;先限量 → 再懒渲 → 后分批 → 终极后台协作 1 虚拟滚动&#xff1a;一次只保留“看得见”的节点 核心思路&#xff1a;固定容器高度&#xff0c;让滚动条滚动 假象 的总长度&#xff1b;可视窗口内…...

数据结构与算法实战:从理论到落地的深度探索

放在前面咯 数据结构与算法实战&#xff1a;从理论到落地的深度探索 数据结构与算法实战&#xff1a;从理论到落地的深度探索 在计算机科学的浩瀚宇宙中&#xff0c;数据结构与算法犹如璀璨星辰&#xff0c;指引着高效程序设计的方向。它们不仅是开发者解决复杂问题的核心利…...

大文件上传Demo及面试要点

大文件上传功能实现原理 - 面试解析 在面试中解释大文件上传功能的实现原理时&#xff0c;可以从以下几个方面进行说明&#xff1a; 1. 分片上传 (Chunked Upload) 实现原理 &#xff1a; 前端将大文件分割为固定大小(如5MB)的多个分片(Chunk)每个分片独立上传&#xff0c;…...

安宝特案例 | 物流仓储头部企业应用AR+作业流,规范日常安全点检,保障消防安全

安全点检管理的真实性缺失将会造成极大损失。 仓储物流行业有仓库面积大、货物堆放密集、包装材料易燃、整体货值高的特点&#xff0c;且造成火灾的隐患包括建筑结构隐患、消防设置失效、货物存放与操作隐患、电气系统问题、人为因素等&#xff0c;因此安全管理被放在重要位置…...

关于 xpath 查找 XML 元素的一点总结

测试环境 Win7 64 python 3.4.0 实践出真知 代码如下&#xff0c;更换不同的 xpath&#xff0c;和 response_to_check 进行测试 实验 1 xpath ".//xmlns:return//xmlns:copeWith" response_to_check \ <soap:Envelope xmlns"http://www.examp.com…...

JavaScript学习教程,从入门到精通,XMLHttpRequest 与 Ajax 请求详解(25)

XMLHttpRequest 与 Ajax 请求详解 一、XMLHttpRequest 概述 XMLHttpRequest (XHR) 是一个 JavaScript API&#xff0c;用于在浏览器和服务器之间传输数据&#xff0c;而无需刷新页面。它是实现 Ajax (Asynchronous JavaScript and XML) 技术的核心。 主要特点&#xff1a; …...

HTML、XHTML 和 XML区别

HTML、XHTML 和 XML 这三兄弟的区别 HTML: 老大哥&#xff0c;负责网页长啥样&#xff0c;性格比较随和&#xff0c;有点小错误也能容忍。XHTML: 二哥&#xff0c;看着像 HTML&#xff0c;但规矩严&#xff0c;是按 XML 的规矩来的 HTML&#xff0c;更规范。XML: 小弟&#xf…...

形象解释 HTTP 的四种常见请求方式及其中的区别联系

HTTP 的常见请求方式常见的有四种&#xff1a;GET、POST、PUT、DELETE&#xff0c;它们各自的功能不一样。 &#x1f35c; 场景比喻&#xff1a;HTTP 请求像“去餐厅点菜” 请求方式行为餐厅比喻说明GET获取数据看菜单/问服务员&#xff1a;你们有什么菜&#xff1f;不带食材、…...

微信小程序根据图片生成背景颜色有效果图

效果图 取得是图片中间10个像素算出背景颜色 .wxml <canvas type"2d" id"imageCanvas" style"--w: {{w}}px;--h: {{h}}px;" /> <view style"background: {{backgroundColor}};"><image bind:tap"updateIndex&qu…...

实时步数统计系统 kafka + spark +redis

基于微服务架构设计并实现了一个实时步数统计系统&#xff0c;采用生产者-消费者模式&#xff0c;利用Kafka实现消息队列&#xff0c;Spark Streaming处理实时数据流&#xff0c;Redis提供高性能数据存储&#xff0c;实现了一个高并发、低延迟的数据处理系统&#xff0c;支持多…...

使用 Docker 安装 SQL Server 2022 并解决 Navicat 连接问题

在使用 Docker 安装 SQL Server 时&#xff0c;很多人可能遇到过无法通过 Navicat 等数据库客户端连接到容器的情况。尤其是尝试使用 mcr.microsoft.com/mssql/server:2022-latest 镜像时&#xff0c;可能会发现 Navicat一直转圈&#xff0c;无法连接到数据库。在这篇博客中&am…...

使用 Node、Express 和 MongoDB 构建一个项目工程

本文将详细介绍如何使用 Node.js Express MongoDB 构建一个完整的 RESTful API 后端项目&#xff0c;涵盖&#xff1a; 项目初始化 Express 服务器搭建 MongoDB 数据库连接 REST API 设计&#xff08;CRUD 操作&#xff09; 错误处理与中间件 源码结构与完整代码 部署建…...

基本元器件电阻、电容、电感的高频知识和大厂真题解析

本文首先举例分析各个方向的工程师如何定制化准备硬件岗位面试,各个击破; 然后根据实战经验总结硬件领域中电阻电容电感等的主要笔试、面试高频考题考点; 最后,列出最新最全的基本元器件笔试面试的真题和模拟题,供大家参考。 本专栏预计更新50期左右。当前第3期 一、硬件…...

Unity InputSystem触摸屏问题

最近把Unity打包后的windows软件放到windows触摸屏一体机上测试&#xff0c;发现部分屏幕触摸点击不了按钮&#xff0c;测试了其他应用程序都正常。 这个一体机是这样的&#xff0c;一个电脑机箱&#xff0c;外接一个可以触摸的显示屏&#xff0c;然后UGUI的按钮就间歇性点不了…...

分布式微服务架构,数据库连接池设计策略

在分布式微服务架构中&#xff0c;数据库连接池的设计远比单体应用复杂&#xff0c;涉及资源隔离、连接管理、性能调优和高可用等问题。下面是面向专业软件架构师的系统化分析与策略建议&#xff1a; 一、核心挑战 每个服务独立运行&#xff0c;连接池分散 每个微服务维护自己的…...

差分信号抗噪声原理:

差分信号抗噪声原理&#xff1a; 差分信号除了能很好地解决发送和接收参考点电位不同的问题外&#xff0c;差分信号的另一个重要优势就是在一定条件下其抗干扰能力比单端信号更强。对于单端信号传输&#xff0c;外界对它的干扰噪声直接叠加在信号上&#xff0c;接收端直接检测输…...

【数据分析】酵母实验多指标数据的 R 语言分析与可视化

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载必要的R包数据下载定义函数发育分析(development analysis)数据导入与预处理数据子集创建绘图模型分析两两比较生存分析(survival analysis)数据导入与预处理数据子集创建绘…...

AI | 最近比较火的几个生成式对话 AI

关注&#xff1a;CodingTechWork 引言 生成式对话 AI 正在迅速改变我们与机器交互的方式&#xff0c;从智能助手到内容创作&#xff0c;其应用范围广泛且深远。本文将深入探讨几款当前热门的生成式对话 AI 模型&#xff0c;包括 Kimi、DeepSeek、ChatGPT、文心一言、通义千问和…...

将视频生成视频二维码步骤

如何将视频链接生成二维码 生成与视频关联的二维码通常涉及以下几个方面&#xff1a;选择合适的库或工具、准备视频链接以及将其转换为二维码图像。以下是详细的说明&#xff1a; 使用JavaScript/Vue框架生成二维码 在前端开发中&#xff0c;可以使用 qrcode 或者 vue-qrcod…...

以安科瑞 EMS3.0 为依托,打造网荷储充一体化典范

在“双碳”目标与能源革命的浪潮中&#xff0c;安科瑞电气股份有限公司推出的EMS3.0微电网智慧能源平台&#xff0c;以“源-网-荷-储-充”全链路协同为核心&#xff0c;通过物联网、大数据与AI技术的深度融合&#xff0c;为企业提供了一套智能化、高效化、低碳化的能源管理解决…...

堆和二叉树--数据结构初阶(3)(C/C++)

文章目录 前言理论部分堆的模拟实现:(这里举的大根堆)堆的创建二叉树的遍历二叉树的一些其他功能实现 作业部分 前言 这期的话讲解的是堆和二叉树的理论部分和习题部分 理论部分 二叉树的几个性质:1.对于任意一个二叉树&#xff0c;度为0的节点比度为2的节点多一个 2.对于完全…...

CLIP和SimCLR集成到图像-文本检索系统技术实现步骤和部署方案(代码版)

将 CLIP(多模态对比学习)和 SimCLR(单模态对比学习)集成到 图像-文本检索系统(如搜索引擎、电子商务平台)的技术实现步骤和部署方案,结合代码示例与工程化思路: ### 一、技术实现核心步骤 1. 环境搭建与依赖安装 # 安装 PyTorch(支持 GPU 加速) pip install torch…...

R/G-B/G色温坐标系下对横纵坐标取对数的优势

有些白平衡色温坐标系会分别对横纵坐标取对数运算。 这样做有什么优势呢? 我们知道对数函数对0-1之间的因变量值具有扩展作用。即自变量x变化比较小时,经过对数函数作用后可以把因变量扩展到较大范围内,即x变化较小时,y变化较大,增加了识别数据的识别性。 由于Raw数据中的…...

Java开发工具IntelliJ IDEA v2025.1——全面支持Java 24、整合AI

IntelliJ IDEA 是由 JetBrains 开发的智能 Java IDE&#xff0c;提供代码自动补全、重构工具、框架集成&#xff08;Spring/JPA 等&#xff09;、数据库工具和调试支持&#xff0c;通过深度代码分析与跨语言功能优化企业级开发流程&#xff0c;被广泛认可为专业 Java 开发者的高…...

IDEA启动报错Failed to create JVM. JVM path的解决办法

今天修改了 IntelliJ IDEA 2023.1 的配置文件 idea64.exe.vmoptions 后启动报错&#xff1a; if you already hava a JDK installed, define a JAVA_HOME variable in Computer > Systen Properties > System Settings > Environment Variables.Failed to create JV…...

R语言中的常用内置函数

常用的数值函数 常用的字符函数 与概率分布相关的函数 有用的统计函数 数据来源:《数据挖掘与数据分析&#xff1a;基于R语言》王阳 2024年1月出版...

docker容器监控自动恢复

关于实现对docker容器监控以及自动恢复&#xff0c;这里介绍两种实现方案。 方案1&#xff1a; 实现思路&#xff1a; 找到&#xff08;根据正则表达式&#xff09;所有待监控的docker容器&#xff0c;此处筛选逻辑根据docker运行状态找到已停止&#xff08;Exit&#xff09;类…...

【记录手贱bug日常】IDEA 配置vmoptions后打不开,重新安装,删注册表均无用

今天早上来公司&#xff0c;闲着没事优化优化自己的"锄头"idea&#xff0c;然后想着看看idea用的啥垃圾回收器&#xff0c;后来手动改成了-XX:UseG1GC&#xff0c;满心欢喜觉得没什么问题&#xff0c;直接删除缓存重启&#xff0c;结果不出意料的出问题了&#xff0c…...

STM32F407使用ESP8266实现阿里云OTA(中)

文章目录 前言一、程序分析二、程序讲解1. main函数2. Get_Version()函数3. esp_Init()函数4. Check_Updata()函数结语前言 从上一章STM32F407使用ESP8266实现阿里云OTA(上)中我们已经对连接阿里云和从阿里云获取升级包的流程非常的熟悉了。所以本章我们进行STM32的程序开发…...

如何利用快照与备份快速恢复服务器的数据

在服务器上利用**快照&#xff08;Snapshot&#xff09;**和**备份&#xff08;Backup&#xff09;**快速恢复数据&#xff0c;可显著减少停机时间并确保业务连续性。以下是具体操作步骤和最佳实践&#xff1a; --- ### **1. 快照&#xff08;Snapshot&#xff09;恢复** **适…...

【Leetcode 每日一题】2799. 统计完全子数组的数目

问题背景 给你一个由 正 整数组成的数组 n u m s nums nums。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序…...

主流操作系统对比分析(macOS、Linux、Windows、Unix)

主流操作系统对比分析&#xff08;macOS、Linux、Windows、Unix&#xff09; 一、系统基本介绍 系统核心特点典型代表macOS苹果公司开发&#xff0c;基于 Unix&#xff08;BSD&#xff09;&#xff0c;闭源&#xff0c;专为苹果硬件优化&#xff0c;强调用户体验和设计美学。m…...

Qt使用 SQLite 数据库的基本方法

在 Qt 中&#xff0c;使用 SQLite 数据库的基本方法与 MySQL 类似&#xff0c;但 SQLite 是一个轻量级的嵌入式数据库&#xff0c;通常不需要外部数据库服务器。你可以直接在本地磁盘上操作 SQLite 数据库文件。 1. 安装 SQLite 驱动 通常&#xff0c;Qt 默认包含了对 SQLite…...

【刷题系列】LeetCode消失的数字、轮转数组

文章目录 1、消失的数字1.1 题目描述1.2 题目分析 2、轮转数字2.1 题目描述2.2 题目分析 1、消失的数字 原题链接&#xff1a;消失的数字 1.1 题目描述 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗…...

Unreal Niagara制作SubUV贴图翻页动画

SubUV翻页动画是游戏中的常见功能&#xff0c;通过对每一小块UV进行移动可以模拟动画效果&#xff0c;接下来对下图进行SubUV动画的制作。 (金币测试图下载地址&#xff1a;https://download.csdn.net/download/grayrail/90684422&#xff09; 最终效果如下&#xff1a; 1.…...

【C++】模版初阶:函数模板、类模板

文章目录 一、为什么要使用模板二、什么是函数模板1、函数模板&#xff08;1&#xff09;概念&#xff08;2&#xff09;格式&#xff08;3&#xff09;原理&#xff08;4&#xff09;函数模板的实例化&#xff08;5&#xff09;模板参数的匹配原则 2、类模板&#xff08;1&…...

Kotlin基础知识全面解析(下)

文章目录 第六章&#xff1a;集合与函数式编程6.1 集合概述6.2 集合操作6.3 序列 第七章&#xff1a;协程与异步编程7.1 协程基础7.2 挂起函数7.3 异步与等待7.4 协程上下文与调度器 第八章&#xff1a;Kotlin标准库8.1 作用域函数let函数run函数with函数apply函数also函数 8.2…...