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

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议

目录

前言

一、UDP网络编程

1.Qt项目文件

2.UDP类

QUdpSocket

QNetworkDatagram

3.UDP回显服务器案例

细节

服务器设计

客户端设计

二、TCP网络编程

1.TCP类

QTcpServer

QTcpSocket

2.TCP回显服务器案例

细节

服务器设计

客户端设计

三、HTTP客户端

1.HTTP客户端类 

QNetworkAccessManager

QNetworkRequest

QNetworkReply

2.HTTP客户端案例


前言

        我们之前学习的系统相关的内容,在不同的系统下的理论和实现可能都不太一样,但是对于计算机网络模块来说,因为网络提供了不同主机之间的信息通信,那么如何想让两个主机进行通信,那么他们的通信模块,也就是计算机模块的实现也就必须是一样的才可以。所以说计算机网络模块的实现对于不同的系统也是一样的,最主要的区别就是在于语言层面上,对于网络编程的系统接口的封装。对于C++标准库中,一直是没有提供网络编程相关的API库。

        在整个网络协议栈来看,网络编程就是我们对于用户层的一种编写,但是我们想要传输数据的时候需要传输层协议的支持,但是传输层协议有两个,所以我们在应用层也需要采用一些接口去指定传输层协议。

一、UDP网络编程

1.Qt项目文件

        .pro文件是 Qt 项目文件。它是一个文本文件,包含了项目的各种信息和配置,用于指导qmake如何构建 Qt 项目。所以在Qt中进行网络编程之前,需要在项目当中的.pro文件中添加network模块来引入网络编程模块。在我们之前使用的所有控件都是包含在QtCore模块当中的,只不过默认生成.pro文件的时候就已经添加了。而且Qt来提供了很多其他的模块。

        Qt为什么要划分出这么多模块呢?因为Qt本身是一个非常大的框架,如果我们默认把所有Qt提高的功能模块全都一下引入项目当中,那么即使我们写一个简单的打印helloworld,那么生成的可执行程序也会 非常的大,可执行程序内部编译了许多用不到的内容。所以为了让生成的Qt项目更加的轻量化,那么就把不同的功能划分成了多个模块,我们需要使用的时候,就需要在.pro文件中引入包含了。

        而且为了让多模块的项目更加的轻量化,Qt也提高了模块的动态库和静态库的两种版本。 

2.UDP类

        Qt对于UDP的类有两个,一个是QUdpSocket表示udp通信套接字文件类,另一个是表示一个UDP数据报的类QNetworkDatagram类。

QUdpSocket
名称说明

bind(const QHostAddress&,  quint16)

绑定指定的端口号
receiveDatagram()返回一个UDP数据报对象
writeDatagram(const QNetworkDatagram&)发送一个UDP数据报
readyRead信号在收到数据并准备就绪后触发
  • 对于读取数据的操作,在C++语言层面的接口或者系统的底层原生接口默认都是阻塞方式的等待,当然也可以设置非阻塞,而Qt在处理读取数据操作的时候,并不是阻塞或者非阻塞等待的方式,而是采用信号槽机制,当有数据到来并就绪只会,就会发送readRead信号。
  • QHostAddress是一个用于表示IP地址的一个类,对于服务器来说设置为QHostAddress::Any即可,表示可以用于监听任何地址的连接,对于IPv4和IPv6都适用。
  • 对于bind函数可能会绑定失败,但是他会将失败的原因存放起来,可以通过errorString成员函数获取到失败信息。
QNetworkDatagram
名称说明
QNetworkDatagram(const QByteArray&, const HostAddress&, quint16)构造函数,通过QByteArray,目标ip和端口号构造一个UDP数据报
data()获取数据报内部持有的数据,返回一个QByteArray类型对象
senderAddress()获取数据报中包含的对端ip地址
senderPort()获取数据报中包含的对端端口号

3.UDP回显服务器案例

        只是一个使用网络接口的案例,因为一般来说服务器都不会带有图形化界面的。

细节
  • 在readyRead信号绑定槽函数和bind操作的顺序来说,要先绑定信号槽,后bind,因为一旦绑定ip和端口号之后,就可能会有通信数据到来了。那么在进行信号槽的绑定,就会来不及了,早到的数据就因为没有槽函数,所以不进行处理了。
  • 我们下面的服务器设计中带有了图形化界面,在配置文件.pro文件中也可以看到我们引入了gui模块,那么我们的云服务器默认是没有装配图形化界面的,所以是没有办法直接将我们下面写的服务器端代码放入到云服务器允许的。
  • 而对于我们现在写的Qt的udp客户端是可以直接连接linux服务器下的udp服务器的。所以说网络底层协议的实现都是一样的。udp都是一套逻辑。一般Qt都不会写服务器,大多数都是写客户端,然后用Qt客户端连接linux服务器。
服务器设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();QString porcess(const QString& request);public slots:void processRequest();private:Ui::Widget *ui;//引入Udp成员QUdpSocket* socket;
};

widget.cpp文件 

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QNetworkDatagram>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//创建udp对象socket = new QUdpSocket(this);//设置窗口标题this->setWindowTitle("服务器");//连接信号槽connect(socket, &QUdpSocket::readyRead, this, &Widget::processRequest);//绑定端口号bool retbind = socket->bind(QHostAddress::Any, 8082);if(retbind == false){QMessageBox::critical(this, "服务器启动出错", socket->errorString());return;}}Widget::~Widget()
{delete ui;
}//但是我们这里是回显,所以没有什么处理过程
QString Widget::porcess(const QString &request)
{return request;
}void Widget::processRequest()
{//获取请求信息const QNetworkDatagram& udp_request =  socket->receiveDatagram();//转化为字符串类型QString data_request = udp_request.data();//处理请求const QString& data = porcess(data_request);//构建相应数据报QNetworkDatagram response(data.toUtf8(), udp_request.senderAddress(), udp_request.senderPort());//发送回客户端socket->writeDatagram(response);//把客户端发的信息显示到listWidget控件上QString log = "[" + udp_request.senderAddress().toString() + ":" + QString::number(udp_request.senderPort())+ "]" + "message:" + data_request;ui->listWidget->addItem(log);
}
客户端设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;//引入udp对象QUdpSocket* socket;
};

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QNetworkDatagram>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口名称this->setWindowTitle("客户端");//创建udp对象socket = new QUdpSocket(this);//连接信号槽connect(socket, &QUdpSocket::readyRead, this, [=](){//获取数据报const QNetworkDatagram udp_response = socket->receiveDatagram();//读取数据const QString& data = udp_response.data();//写入对话框中ui->listWidget->addItem("服务器:" + data);});
}Widget::~Widget()
{delete ui;
}
//发送按钮
void Widget::on_pushButton_clicked()
{//获取输入框的内容const QString& text = ui->lineEdit->text();//构建请求数据报const QString ip = "127.0.0.1";const quint16 port = 8082;QNetworkDatagram data_request(text.toUtf8(), QHostAddress(ip), port);//发送数据socket->writeDatagram(data_request);//更新对话框中的内容ui->listWidget->addItem("客户端:" + text);//情况输入框ui->lineEdit->clear();
}

二、TCP网络编程

1.TCP类

        Qt对于TCP的类提供两个,第一个是QTcpServer用于监听端口,实现获取客户端连接的操作,相当于是listensocket以及对于bind、listen以及accept接口函数的一个封装。第二个是用于客户端和服务器之间数据交互的类QTcpSocket类。

QTcpServer
名称说明
listen(const QHostAddress&, quint16 port)绑定ip和端口号,并开始监听,相当于bind和listen的结合
nextPendingConnection()从系统当中获取到一个已经建立好的tcp连接,返回一个QTcpSocket对象,通过这个对象是实现与客户端之间的通信
newConnection信号有新的客户端建立连接完毕之后触发的信号
QTcpSocket
名称说明
readAll()读取当前接收缓冲区中的所有数据,返回QByteArray对象
write(const QByteArray&)把输入写入到socket的发送缓冲区中
deleteLater()暂时把socket对象标记为无效,Qt会在下个事件循环中析构释放该对象、
peerAddress()获取对端ip地址
peerPort()获取对端端口号

connectToHost( const QString &hostName, quint16 port)

向服务器发起连接
readyRead信号有数据到来并准备就绪触发
disconnected信号连接断开的时候触发

2.TCP回显服务器案例

细节
  • 对于客户端向服务器发起连接的connectToHost函数返回值为void类型,但是我们还是要判断是否连接成功了,所以QTcpSocket类中提供了waitForConnected函数,该函数的作用是让当前线程处理等待状态,直到连接成功,或者连接反馈错误为止,又或者说超时。
服务器设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void processConnection();private:Ui::Widget *ui;//引入Tcp对象QTcpServer* socket;
};

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口标题this->setWindowTitle("服务器");//tcp对象实例化socket = new QTcpServer(this);//绑定newConnection的信号槽函数connect(socket, &QTcpServer::newConnection, this, &Widget::processConnection);//进行bind和listen操作bool retlisten = socket->listen(QHostAddress::Any, 8082);if(retlisten == false){QMessageBox::critical(this, "服务器启动失败", socket->errorString());return;}
}Widget::~Widget()
{delete ui;
}//获取新连接的信号处理函数
void Widget::processConnection()
{//获取新连接QTcpSocket* client = socket->nextPendingConnection();//构建日志QString log = "[" + client->peerAddress().toString() + ":" + QString::number(client->peerPort()) + "] 新客户端上线";ui->listWidget->addItem(log);//通过信号槽触发接收消息connect(client, &QTcpSocket::readyRead, this, [=](){//读取消息QString message = client->readAll();//处理消息--此处没有处理,只是回显//写回到客户端client->write(message.toUtf8());//构建日志QString log = "[" + client->peerAddress().toString() + ":" + QString::number(client->peerPort()) + "] say: " + message;//写到界面ui->listWidget->addItem(log);});//处理断开连接的信号槽函数connect(client, &QTcpSocket::disconnected, this, [=](){//构建日志QString log = "[" + client->peerAddress().toString() + ":" + QString::number(client->peerPort()) + "] 客户端下线";//释放对象client->deleteLater();});
}
客户端设计

widget.h文件

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;//构建tcp对象QTcpSocket* socket;
};

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口标题this->setWindowTitle("客户端 ");//实例化tcp对象socket = new QTcpSocket(this);//向服务器发起连接socket->connectToHost("127.0.0.1", 8082);//确认是否连接成功if(!socket->waitForConnected()){QMessageBox::critical(this, "连接服务器出错", socket->errorString());return;}//绑定接收到消息的信号槽函数connect(socket, &QTcpSocket::readyRead, this, [=](){//获取接收到的内容QString message = socket->readAll();//将内容打印到对话框中QString log = "服务器: " + message;ui->listWidget->addItem(log);});
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取输入框的内容QString message = ui->lineEdit->text();//将内容发送给服务器socket->write(message.toUtf8());//将内容打印到对话框中ui->listWidget->addItem("客户端: " + message);//情况输入框ui->lineEdit->clear();
}

三、HTTP客户端

1.HTTP客户端类 

        Qt中为HTTP协议的客户端主要提供了三个类,一个是QNetworkAccessManager类,该类提供了HTTP有关的核心操作。第二个类是QNetworkRequest类表示一个不含body的HTTP请求。第三个类就是QNetworkReply类,表示一个HTTP的响应。

        上述也说了真正的服务器一定也不会使用Qt就实现,所以Qt就没有提供服务端相关的HTTP类。

QNetworkAccessManager
方法说明
get(const QNetworkRequest&)发起一个HTTP GET请求,返回一个QNetworkReply对象
post(const QNetworkRequest&, const QByteArray&)发起一个HTTP POST请求,也返回一个QNetworkReply对象
QNetworkRequest

        一个HTTP协议的完整报文应该是包括报头和有效载荷的,而这个类只是实现了一个报头,对于有效载荷该类不进行实现,而且对于请求报文来说一般都不会带有一些实质性的内容,只会传递一些kv形式的参数内容,通过post方法来传递,所以post方法也为我们提供了传递kv的参数。

方法说明
QNetworkRequest(const QUrl&)通过Url构造一个HTTP请求
setHeader(QNetworkRequest::knownHeaders header, const QVariant& value)设置请求头部字段

        对于报头的请求行字段,Qt也进行了一定的封装,方便我们去设置请求行,Qt中采用的是枚举类型将常用的请求行字段进行一一列举出来,QNetworkRequest::knownHeaders就是该枚举对象。 

        对于QVariant类对象表示一个类型可变的值。

QNetworkReply
方法说明
error()获取出错状态
errorString()获取出错原因的字符串描述
readAll()获取响应的body字段
header(QNetworkRequest::knownHeaders header)获取响应头部字段
finished信号当客户端收到一个完整的响应报文只会触发

2.HTTP客户端案例

细节

  • 如何想要显示出来元素的HTML报文,那么就不可以使用QTextEdit控件,因为他会对HTML代码进行渲染,显示出来的就不是原始的HTML报文了,所以需要使用QPlainTextEidt控件。
  • 对于get、post等系列函数只是负责发送请求,不负责请求的等待,所以说他返回的响应对象是一个没有实际内容的对象,那什么时候才收到响应呢?依靠的是finished信号,通过信号槽机制去处理finished信号,也就相当于处理响应了。
#include "widget.h"
#include "ui_widget.h"
#include <QNetworkReply>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化manager = new QNetworkAccessManager(this);
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{//获取到输入框中的url,并构建一个url对象QUrl url(ui->lineEdit->text());//构造一个http请求对象QNetworkRequest request(url);//发送get请求,返回一个响应QNetworkReply* response = manager->get(request);//信号槽connect(response, &QNetworkReply::finished, this, [=](){//正确响应了if(response->error() == QNetworkReply::NoError){QString html_data = response->readAll();ui->plainTextEdit->setPlainText(html_data);}else{ui->plainTextEdit->setPlainText(response->errorString());}//释放response对象response->deleteLater();});
}

相关文章:

[Qt]系统相关-网络编程-TCP、UDP、HTTP协议

目录 前言 一、UDP网络编程 1.Qt项目文件 2.UDP类 QUdpSocket QNetworkDatagram 3.UDP回显服务器案例 细节 服务器设计 客户端设计 二、TCP网络编程 1.TCP类 QTcpServer QTcpSocket 2.TCP回显服务器案例 细节 服务器设计 客户端设计 三、HTTP客户端 1.HTTP…...

wow-agent---task4 MetaGPT初体验

先说坑&#xff1a; 1.使用git clone模式安装metagpt 2.模型尽量使用在线模型或本地高参数模型。 这里使用python3.10.11调试成功 一&#xff0c;安装 安装 | MetaGPT&#xff0c;参考这里的以开发模型进行安装 git clone https://github.com/geekan/MetaGPT.git cd /you…...

信息系统管理工程师第6-8章精讲视频及配套千题通关双双发布,附第14章思维导图

这一周发文少&#xff0c;不是我在偷懒&#xff0c;而是在和信管的视频及千题通关“”浴血奋战 &#xff0c;特别是第8章卡了我很久&#xff0c;因为内容实在太多&#xff0c;精讲视频估计都差不多4个小时了&#xff0c;还好终于在春节前拿下&#xff0c;提供给小分队的同学&am…...

npm启动前端项目时报错(vue) error:0308010C:digital envelope routines::unsupported

vue 启动项目时&#xff0c;npm run serve 报下面的错&#xff1a; error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:67:19) at Object.createHash (node:crypto:133:10) at FSReqCallback.readFileAfterClose [as on…...

Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)

本文讲Excel中如何整理美化数据的实例&#xff0c;以及CtrlT 超级表格的常用功能。 目录 1&#xff0c;Excel中整理美化数据 1-1&#xff0c;设置间隔行颜色 1-2&#xff0c;给总销量列设置数据条 1-3&#xff0c;根据总销量设置排序 1-4&#xff0c;加一个销售趋势列 2&…...

力扣算法题——11.盛最多水的容器

目录 &#x1f495;1.题目 &#x1f495;2.解析思路 本题思路总览 借助双指针探索规律 从规律到代码实现的转化 双指针的具体实现 代码整体流程 &#x1f495;3.代码实现 &#x1f495;4.完结 二十七步也能走完逆流河吗 &#x1f495;1.题目 &#x1f495;2.解析思路…...

微服务学习-服务调用组件 OpenFeign 实战

1. OpenFeign 接口方法编写规范 1.1. 在编写 OpenFeign 接口方法时&#xff0c;需要遵循以下规范 1.1.1.1. 接口中的方法必须使用 RequestMapping、GetMapping、PostMapping 等注解声明 HTTP 请求的类型。 1.1.1.2. 方法的参数可以使用 RequestParam、RequestHeader、PathVa…...

PDF2WORD万能方法,如何控制Adobe dc pro,自动实现PDF转word

如何用JavaScript控制Adobe DC Pro来自动实现PDF转Word。首先&#xff0c;我需要考虑Adobe DC Pro是否有公开的API或者扩展接口。我记得Adobe Acrobat Pro DC支持JavaScript&#xff0c;但主要是用于表单处理和文档操作&#xff0c;比如Acrobat JavaScript。不过&#xff0c;自…...

Java Web-Tomcat Servlet

Web服务器-Tomcat Web服务器简介 Web 服务器是一种软件程序&#xff0c;它主要用于在网络上接收和处理客户端&#xff08;如浏览器&#xff09;发送的 HTTP 请求&#xff0c;并返回相应的网页内容或数据。以下是关于 Web 服务器的详细介绍&#xff1a; 功能 接收请求&#…...

寒假学web--day09

简介 一些魔法函数与php反序列化漏洞 tips 反序列化和类的方法无关&#xff0c;不能把类的方法序列化 将php.exe所在目录放到环境变量中&#xff0c;就可以在终端里通过php.exe ./命令来执行php代码 魔术方法 __construct() 在实例化一个对象时会自动调用&#xff0c;可…...

深度解析:基于Vue 3的教育管理系统架构设计与优化实践

一、项目架构分析 1. 技术栈全景 项目采用 Vue 3 TypeScript Tailwind CSS 技术组合&#xff0c;体现了现代前端开发的三大趋势&#xff1a; 响应式编程&#xff1a;通过Vue 3的Composition API实现细粒度响应 类型安全&#xff1a;约60%的组件采用TypeScript编写 原子化…...

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...

mysql_store_result的概念和使用案例

mysql_store_result() 是 MySQL C API 中的一个函数&#xff0c;用于检索一个完整的结果集到一个客户端。当执行一个查询&#xff08;通常是 SELECT 查询&#xff09;并希望处理所有返回的数据时&#xff0c;可以使用此函数。 概念 mysql_store_result() 函数的原型如下&…...

docker安装MySQL8:docker离线安装MySQL、docker在线安装MySQL、MySQL镜像下载、MySQL配置、MySQL命令

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull mysql:8.0.41 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜…...

黑盒/白盒运维监控

运维监控分为黑盒和白盒 黑盒&#xff1a;不深入代码&#xff0c;在系统角度看TPS&#xff0c;延迟等指标 白盒&#xff1a;深入代码分析&#xff0c;通过日志捕捉&#xff0c;以及主动上报告警等来进行监控 黑盒监控&#xff1a; 1. 页面功能&#xff1a;域名是否可访问&…...

奖励模型:解析大语言模型的关键工具

标题&#xff1a;奖励模型&#xff1a;解析大语言模型的关键工具 文章信息摘要&#xff1a; 奖励模型是理解和审核大语言模型(LLM)的重要工具&#xff0c;通过简单的评估方式提供了模型内部表征和性能的深入洞察。它不仅能静态比较模型表现&#xff0c;还可帮助诊断训练问题&a…...

Boot 系统选择U启动

1.进入Boot 系统 F2 或 Del Boot --->Boot 0ption Priorities #4 KingstwongDataTravele 是U盘 调整搭到#1 2.保持重启就好...

001 mybatis入门

文章目录 mybatis是什么ORM是什么ORM框架和MyBatis的区别#{}和${}的区别编码流程UserDaoImpl.javaUserDao.javaUser.javadb.propertiesSqlMapConfig.xmlUserMapper.xmlMybatisTest.javapom.xmluser.sql 表现层 SpringMVC 业务层 Spring 持久层 Mybatis https://mybatis.org/myb…...

【前端SEO】使用Vue.js + Nuxt 框架构建服务端渲染 (SSR) 应用满足SEO需求

Nuxt.js 是一个基于 Vue.js 的通用应用框架&#xff0c;它简化了使用 Vue 构建服务端渲染 (SSR) 应用的流程。除了 SSR 之外&#xff0c;Nuxt.js 还支持静态站点生成&#xff08;Static Site Generation, SSG&#xff09;&#xff0c;渐进式网络应用&#xff08;Progressive We…...

sysbench压力测试工具mysql以及postgresql

sysbench压力测试工具mysql以及postgresql sysbench工具安装 [postgresoradb sysbench-1.0.20]$ ./autogen.sh ./autogen.sh: running libtoolize --copy --force libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, config. libtoolize: copying file config/ltm…...

9.中断系统、EXTI外部中断

中断系统原理 中断 中断系统是管理和执行中断的逻辑结构&#xff0c;外部中断是众多能产生中断的外设之一&#xff0c;所以本节我们就借助外部中断来学习一下中断系统。在以后学习其它外设的时候&#xff0c;也是会经常和中断打交道的。 中断&#xff1a;在主程序运行过程中…...

Oracle 12c 中的 CDB和PDB的启动和关闭

一、简介 Oracle 12c引入了多租户架构&#xff0c;允许一个容器数据库&#xff08;Container Database, CDB&#xff09;托管多个独立的可插拔数据库&#xff08;Pluggable Database, PDB&#xff09;。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...

RocketMQ原理—4.消息读写的性能优化

大纲 1.Producer基于队列的消息分发机制 2.Producer基于Hash的有序消息分发 3.Broker如何实现高并发消息数据写入 4.RocketMQ读写队列的运作原理分析 5.Consumer拉取消息的流程原理分析 6.ConsumeQueue的随机位置读取需求分析 7.ConsumeQueue的物理存储结构设计 8.Cons…...

【C++动态规划 网格】2328. 网格图中递增路径的数目|2001

本文涉及知识点 C动态规划 LeetCode2328. 网格图中递增路径的数目 给你一个 m x n 的整数网格图 grid &#xff0c;你可以从一个格子移动到 4 个方向相邻的任意一个格子。 请你返回在网格图中从 任意 格子出发&#xff0c;达到 任意 格子&#xff0c;且路径中的数字是 严格递…...

Web3.0时代的挑战与机遇:以开源2+1链动模式AI智能名片S2B2C商城小程序为例的深度探讨

摘要&#xff1a;Web3.0作为互联网的下一代形态&#xff0c;承载着去中心化、开放性和安全性的重要愿景。然而&#xff0c;其高门槛、用户体验差等问题阻碍了Web3.0的主流化进程。本文旨在深入探讨Web3.0面临的挑战&#xff0c;并提出利用开源21链动模式、AI智能名片及S2B2C商城…...

MySQL(高级特性篇) 12 章——数据库其它调优策略

一、数据库调优的措施 &#xff08;1&#xff09;调优的目标 尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务&#xff08;吞吐量最大&#xff09;合理的结构设计和参数调整&#xff0c;以提高用户操作的响应速度&#xff08;响应速度更快&#xff09;减少系统…...

单片机基础模块学习——DS18B20温度传感器芯片

不知道该往哪走的时候&#xff0c;就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚&#xff0c;分别为 GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议 优点&#xff1a;占用端口少&#xff0c;电路设计方便 同时该协议要求通过上拉电阻…...

掌握长尾关键词优化技巧提升SEO效果与流量增长策略

内容概要 长尾关键词是指由三个或更多个词组成的关键词&#xff0c;这类关键词通常搜索量相对较低&#xff0c;但在搜索引擎优化&#xff08;SEO&#xff09;中的作用却不可忽视。它们能够精确定位用户的需求&#xff0c;因为长尾关键词往往反映了用户更具体的搜索意图。掌握长…...

AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs

论文标题 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning 跨同构异构图的小样本提示学习 论文链接 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning论文下载 论文作者 Xingtong Yu, Yuan…...

高频 SQL 50 题(基础版)_620. 有趣的电影

高频 SQL 50 题&#xff08;基础版&#xff09;_620. 有趣的电影 一级目录 表&#xff1a;cinema id 是该表的主键(具有唯一值的列)。 每行包含有关电影名称、类型和评级的信息。 评级为 [0,10] 范围内的小数点后 2 位浮点数。 编写解决方案&#xff0c;找出所有影片描述为 …...