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

【RabbitMQ】RabbitMQ 的概念以及使用RabbitMQ编写生产者消费者代码

目录

1. RabbitMQ 核心概念

1.1生产者和消费者

1.2 Connection和Channel

1.3 Virtual host

1.4 Queue

1.5 Exchange

1.6 RabbitMO工作流程

2. AMQP

3.RabbitMO快速入门

3.1.引入依赖

3.2.编写生产者代码

​3.3.编写消费者代码

4.源码


1. RabbitMQ 核心概念

在安装RabbitMQ和管理界面之后, 访问云服务器ip和相应的端口号, 会展示如下界面:

界面上的导航栏共分6部分,这6部分分别是什么意思呢,我们先看看RabbitMO的工作流程 

RabbitMO是一个消息中间件, 也是一个生产者消费者模型, 它负责接收, 存储并转发消息

消息传递的过程类似邮局:

当你要发送一个邮件时,你把你的邮件放到邮局,邮局接收邮件,并通过邮递员送到收件人的手上.

按照这个逻辑,制片人就类似邮件发件人.Consumer就是收件人,RabbitMQ就类似于邮局

1.1生产者和消费者

  • Producer: 生产者,是RabbitMQ Server的客户端,向RabbitMQ发送消息
  • Consumer: 消费者,也是RabbitMQ Server的客户端,从RabbitMQ接收消息
  • Broker: 其实就是RabbitMO Server,主要是接收和收发消息

生产者(Producer)创建消息, 然后发布到RabbitMQ中, 在实际应用中, 消息通常是一个带有一定业务
逻辑结构的数据, 比如JSON字符串, 消息可以带有一定的标签, RabbitMO会根据标签进行路由, 把消息发送给感兴趣的消费者(Consumer).

消费者连接到RabbitMQ服务器, 就可以消费消息了, 消费的过程中, 标签会被丢掉, 消费者只会收到
消息, 并不知道消息的生产者是谁, 当然消费者也不需要知道.

对于 RabbitMO 来说, 一个 RabbitMO Broker 可以简单地看作一个 RabbitMO 服务节点, 或者
RabbitMO 服务实例, 大多数情况下也可以将一个 RabbitMO Broker 看作一台 RabbitMO 服务器

1.2 Connection和Channel

Connection: 连接. 是客户端和RabbitMO服务器之间的一个TCP连接, 这个连接是建立消息传递的基础,它负责传输客户端和服务器之间的所有数据和控制信息.

Channel: 通道, 信道. Channel是在Connection之上的一个抽象层, 在 RabbitMO中, 一个TCP连接可以有多个Channel, 每个Channel都是独立的虚拟连接, 消息的发送和接收都是基于 Channel的.

通道的主要作用是将消息的读写操作复用到同一个TCP连接上,这样可以减少建立和关闭连接的开销提高性能.

1.3 Virtual host

Virtual host: 虚拟主机. 这是一个虚拟概念, 它为消息队列提供了一种逻辑上的隔离机制. 对于
RabbitMQ而言, 一个 BrokerServer 上可以存在多个 Virtual Host. 当多个不同的用户使用同一个
RabbitMQ Server 提供的服务时,可以虚拟划分出多个vhost,每个用户在自己的 vhost 创建
exchange/queue等

类似MySOL的 "database" , 是一个逻辑上的集合. 一个MySQL服务器可以有多个database

1.4 Queue

Queue: 队列, 是RabbitMO的内部对象, 用于存储消息

多个消费者, 可以订阅同一个队列

1.5 Exchange

Exchange: 交换机. message 到达 broker 的第一站, 它负责接收生产者发送的消息, 并根据特定的规则把这些消息路由到一个或多个Queue列中.

Exchange起到了消息路由的作用,它根据类型和规则来确定如何转发接收到的消息

类似于发快递之后, 物流公司怎么处理呢, 根据咱们的地址来分派这个快递到不同的站点, 然后再送到收件人手里, 这个分配的工作, 就是交换机来做的

1.6 RabbitMO工作流程

理解了上面的概念之后, 再来回顾一下这个图, 来看RabbitMO的工作流程

1. Producer 生产了一条消息
2. Producer 连接到RabbitMQBroker,建立一个连接(Connection), 开启一个信道(Channel)
3. Producer 声明一个交换机(Exchange), 路由消息
4. Producer 声明一个队列(Queue), 存放信息
5. Producer 发送消息至 RabbitMO Broker
6. RabbitMQ Broker 接收消息, 并存入相应的队列(Queue)中, 如果未找到相应的队列, 则根据生产者的配置, 选择丢弃或者退回给生产者.

如果我们把RabbitMQ比作一个物流公司,那么它的一些核心概念可以这样理解:
1.Broker就类似整个物流公司的总部,它负责协调和管理所有的物流站点,确保包裹安全、高效      地送达.

2.Virtual Host可以看作是物流公司为不同的客户或业务部门划分的独立运营中心,每个运营中     心都有自己的仓库(Queue),分拣规则(Exchange)和运输路线(Connection和Channel),这样       可以确保不同客户的包裹处理不会相互干扰,同时提供定制化的服务.

3.Exchange就像是站点里的分拣中心,当包裹到达时,分拣中心会根据包裹上的标签来决定这     个包裹应该送往哪个目的地(队列).快递站点可能有不同类型的分拣中心,有的按照具体地址     分拣,有的将包裹复制给多个收件人等.

4.Queue就是快递站点里的一个个仓库,用来临时存放等待派送的包裹,每个仓库都有一个或       多个快递员(消费者)负责从仓库中取出包裹并派送给最终的收件人.
5.Connection就像是快递员与快递站点之间的通信线路.快递员需要通过这个线路来接收派送     任务(消息).
6.Channel 就像是快递员在执行任务时使用的多个并行的通信线路. 这样,快递员可以同时       处理多个包裹, 比如一边派送包裹, 一边接收新的包裹.

2. AMQP

AMQP(Advanced Message Queuing Protocol) 是一种高级消息队列协议, AMQP定义了一套确定的消息交换功能, 包括交换器(Exchange), 队列(Queue)等, 这些组件共同工作, 使得生产者能够将消息发送到交换器, 然后由队列接收并等待消费者接收, AMOP还定义了一个网络协议, 允许客户端应用通过该协议与消息代理和AMOP模型进行交互通信

RabbitMQ是遵从AMQP协议的, 换句话说, RabbitMQ就是AMQP协议的Erlang的实现(当然abbitMQ还支持STOMP2,MOTT2等协议). AMOP的模型结构和RabbitMO的模型结构是一样的.

3.RabbitMO快速入门

步骤

1.引入依赖
2.编写生产者代码
3.编写消费者代码

3.1.引入依赖

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.21.0</version>
</dependency>

3.2.编写生产者代码

创建连接:

//1.建立连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("8.130.35.237");
connectionFactory.setPort(5672); //需要提前开放端口号
connectionFactory.setUsername("study"); //账号
connectionFactory.setPassword("study"); //密码
connectionFactory.setVirtualHost("test"); //虚拟主机
Connection connection = connectionFactory.newConnection();

创建Channel:

//2.开启信道
Channel channel = connection.createChannel();

声明一个队列Queue:

/*** queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,*                                                Map<String, Object> arguments)* 参数说明:* queue:队列名称* durable:可持久化 true-设置队列为持久化, 待久化的队列会存盘,服务器重启之后, 消息不丢失。* exclusive:是否独占,只能有⼀个消费者监听队列* autoDelete:是否⾃动删除, 当没有Consumer时, ⾃动删除掉* arguments 参数*/
channel.queueDeclare("hello", true, false, false, null);

发送消息:

当一个新的 RabbitMO 节点启动时,它会预声明(declare)几个内置的交换机,内置交换机名称是空
字符串(""). 生产者发送的消息会根据队列名称直接路由到对应的队列.

例如: 如果有一个名为"hello"的队列, 生产者可以直接发送消息到"hello"队列, 而消费者可以从
"hello"队列中接收消息, 而不需要关心交换机的存在, 这种模式非常适合简单的应用场景,其中生产者和消费者之间的通信是一对一的.

//5.发送消息
/*** basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)* 参数说明* exchange: 交换机名称, 简单模式下, 交换机会使用默认的""* routingKey: 内置交换机, routingKey和队列名称保持一致* props: 属性配置* body: 消息*/
String msg = "Hello World";
channel.basicPublish("","hello",null,msg.getBytes());
System.out.println(msg + "消息发送成功!");

释放资源:

//显式地关闭Channel是个好习惯, 但这不是必须的, Connection关闭的时候,Channel也会⾃动关闭. 
channel.close();
connection.close();

运行代码, 观察结果:

运行前:

运行之后, 队列中就已经有了hello这个队列的信息

如果在代码中注掉资源释放的代码,在Connections和Channels也可以看到相关信息

Queue也可以配置显示Consumer相关信息


3.3.编写消费者代码

消费者代码和生产者前3步都是一样的, 第4步改为消费当前队列
1.创建连接
2.创建Channel
3.声明一个队列Queue
4.消费消息
5.释放资源

消费当前队列
basicConsume

/*
basicConsume(String queue, boolean autoAck, Consumer callback)
参数: 
1. queue: 队列名称 
2. autoAck: 是否⾃动确认, 消费者收到消息之后,⾃动和MQ确认 
3. callback: 回调对象 
*/
String basicConsume(String queue, boolean autoAck, Consumer callback) throws 
IOException;

Consumer
用于定义消息消费者的行为.当我们需要从RabbitMQ接收消息时,需要提供一个实现了Consumer
consumer 接口的对象

Defaultconsumer 是 RabbitMQ提供的一个默认消费者,实现了Consumer接口

核心方法:
1. handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,byte[] body):从队列接收到消息时,会自动调用该方法.

在这个方法中,我们可以定义如何处理接收到的消息,例如打印消息内容,处理业务逻辑或者将消息
存储到数据库等

参数说明如下:
consumerTag: 消费者标签,通常是消费者在订阅队列时指定的.
envelope: 包含消息的封包信息,如队列名称,交换机等
properties: 一些配置信息
body: 消息的具体内容

//4.消费消息
/*** basicConsume(String queue, boolean autoAck, Consumer callback)* 参数说明* queue:要消费的队列名称* autoAck:是否自动确认, 消费者收到信息后, 自动和MQ确认* callback:接收到消息后执行的逻辑*/
DefaultConsumer consumer = new DefaultConsumer(channel) {//从队列中收到消息, 就会执行方法@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息: " + new String(body));}
};
channel.basicConsume("hello", true, consumer);

 释放资源:

//等待程序执行完成
Thread.sleep(20000);//5.释放资源
channel.close();
connection.close();

实际上消费者相当于是一个监听程序,不需要关闭资源

运行代码观察结果:

运行程序,我们刚才发送的消息,就收到了

4.源码

生产者代码:

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class ProductDemo {public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {//1.建立连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("8.130.35.237");connectionFactory.setPort(5672); //需要提前开放端口号connectionFactory.setUsername("study"); //账号connectionFactory.setPassword("study"); //密码connectionFactory.setVirtualHost("test"); //虚拟主机Connection connection = connectionFactory.newConnection();//2.开启信道Channel channel = connection.createChannel();//3.声明交换机 使用内置的交换机//4.声明队列/*** queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,*                                                Map<String, Object> arguments)* 参数说明:* queue:队列名称* durable:可持久化 true-设置队列为持久化, 待久化的队列会存盘,服务器重启之后, 消息不丢失。* exclusive:是否独占,只能有⼀个消费者监听队列* autoDelete:是否⾃动删除, 当没有Consumer时, ⾃动删除掉* arguments 参数*/channel.queueDeclare("hello", true, false, false, null);//5.发送消息/*** basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)* 参数说明* exchange: 交换机名称, 简单模式下, 交换机会使用默认的""* routingKey: 内置交换机, routingKey和队列名称保持一致* props: 属性配置* body: 消息*/String msg = "Hello World";channel.basicPublish("","hello",null,msg.getBytes());System.out.println(msg + "消息发送成功!");//6.资源释放channel.close();connection.close();}
}

消费者代码:

import com.rabbitmq.client.*;import java.io.IOException;
import java.util.concurrent.TimeoutException;public class ConsumerDemo {public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {//1.创建连接ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost("8.130.35.237");connectionFactory.setPort(5672); //需要提前开放端口号connectionFactory.setUsername("study"); //账号connectionFactory.setPassword("study"); //密码connectionFactory.setVirtualHost("test"); //虚拟主机Connection connection = connectionFactory.newConnection();//2.创建ChannelChannel channel = connection.createChannel();//3.申明队列(可以省略)
//        channel.queueDeclare("hello", true, false, false, null);//4.消费消息/*** basicConsume(String queue, boolean autoAck, Consumer callback)* 参数说明* queue:要消费的队列名称* autoAck:是否自动确认, 消费者收到信息后, 自动和MQ确认* callback:接收到消息后执行的逻辑*/DefaultConsumer consumer = new DefaultConsumer(channel) {//从队列中收到消息, 就会执行方法@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {System.out.println("接收到消息: " + new String(body));}};String s = channel.basicConsume("hello", true, consumer);//等待程序执行完成Thread.sleep(20000);//5.释放资源channel.close();connection.close();}
}

相关文章:

【RabbitMQ】RabbitMQ 的概念以及使用RabbitMQ编写生产者消费者代码

目录 1. RabbitMQ 核心概念 1.1生产者和消费者 1.2 Connection和Channel 1.3 Virtual host 1.4 Queue 1.5 Exchange 1.6 RabbitMO工作流程 2. AMQP 3.RabbitMO快速入门 3.1.引入依赖 3.2.编写生产者代码 ​3.3.编写消费者代码 4.源码 1. RabbitMQ 核心概念 在安装…...

openmv与stm32通信

控制小车视觉循迹使用 OpenMV 往往是不够的。一般使用 OpenMV 对图像进行处理&#xff0c;将处理过后的数据使用串口发送给STM32&#xff0c;使用STM32控制小车行驶。本文主要讲解 OpenMV 模块与 STM32 间的串口通信以及两种循迹方案&#xff0c;分别是划分检测区域和线性回归。…...

C++ STL全面解析:六大核心组件之一----序列式容器(vector和List)(STL进阶学习)

目录 序列式容器 Vector vector概述 vector的迭代器 vector的数据结构 vector的构造和内存管理 vector的元素操作 List List概述 List的设计结构 List的迭代器 List的数据结构 List的内存构造 List的元素操作 C标准模板库&#xff08;STL&#xff09;是一组高效的…...

【c数据结构】OJ练习篇 帮你更深层次理解链表!(相交链表、相交链表、环形链表、环形链表之寻找环形入口点、判断链表是否是回文结构、 随机链表的复制)

目录 一. 相交链表 二. 环形链表 三. 环形链表之寻找环形入口点 四. 判断链表是否是回文结构 五. 随机链表的复制 一. 相交链表 最简单粗暴的思路&#xff0c;遍历两个链表&#xff0c;分别寻找是否有相同的对应的结点。 我们对两个链表的每个对应的节点进行判断比较&…...

微软开源GraphRAG的使用教程(最全,非常详细)

GraphRAG的介绍 目前微软已经开源了GraphRAG的完整项目代码。对于某一些LLM的下游任务则可以使用GraphRAG去增强自己业务的RAG的表现。项目给出了两种使用方式&#xff1a; 在打包好的项目状态下运行&#xff0c;可进行尝试使用。在源码基础上运行&#xff0c;适合为了下游任…...

使用Refine构建项目(1)初始化项目

要初始化一个空的Refine项目&#xff0c;你可以使用Refine提供的CLI工具create-refine-app。以下是初始化步骤&#xff1a; 使用npx命令&#xff1a; 在命令行中运行以下命令来创建一个新的Refine项目&#xff1a; npx create-refine-applatest my-refine-project这将引导你通过…...

【Docker】安装及使用

1. 安装Docker Desktop Docker Desktop是官方提供的桌面版Docker客户端&#xff0c;在Mac上使用Docker需要安装这个工具。 访问 Docker官方页面 并下载Docker Desktop for Mac。打开下载的.dmg文件&#xff0c;并拖动Docker图标到应用程序文件夹。安装完成后&#xff0c;打开…...

[大语言模型-论文精读] 以《黑神话:悟空》为研究案例探讨VLMs能否玩动作角色扮演游戏?

1. 论文简介 论文《Can VLMs Play Action Role-Playing Games? Take Black Myth Wukong as a Study Case》是阿里巴巴集团的Peng Chen、Pi Bu、Jun Song和Yuan Gao&#xff0c;在2024.09.19提交到arXiv上的研究论文。 论文: https://arxiv.org/abs/2409.12889代码和数据: h…...

提升动态数据查询效率:应对数据库成为性能瓶颈的优化方案

引言 在现代软件系统中&#xff0c;数据库性能是决定整个系统响应速度和处理能力的关键因素之一。然而&#xff0c;当系统负载增加&#xff0c;特别是在高并发、大数据量场景下&#xff0c;数据库性能往往会成为瓶颈&#xff0c;导致查询响应时间延长&#xff0c;影响用户体验…...

Prometheus+grafana+kafka_exporter监控kafka运行情况

使用Prometheus、Grafana和kafka_exporter来监控Kafka的运行情况是一种常见且有效的方案。以下是详细的步骤和说明&#xff1a; 1. 部署kafka_exporter 步骤&#xff1a; 从GitHub下载kafka_exporter的最新版本&#xff1a;kafka_exporter项目地址&#xff08;注意&#xff…...

在vue中:style 的几种使用方式

在日常开发中:style的使用也是比较常见的&#xff1a; 亲测有效 1.最通用的写法 <p :style"{fontFamily:arr.conFontFamily,color:arr.conFontColor,backgroundColor:arr.conBgColor}">{{con.title}}</p> 2.三元表达式 <a :style"{height:…...

商城小程序后端开发实践中出现的问题及其解决方法

前言 商城小程序后端开发中&#xff0c;开发者可能会面临多种问题。以下是一些常见的问题及其解决方法&#xff1a; 一、性能优化 问题&#xff1a;随着用户量的增加和功能的扩展&#xff0c;商城小程序可能会出现响应速度慢、处理效率低的问题。 解决方法&#xff1a; 对数…...

阿里Arthas-Java诊断工具,基本操作和命令使用

Arthas 是阿里巴巴开源的一款Java诊断工具&#xff0c;深受开发者喜爱。它可以帮助开发者在不需要修改代码的情况下&#xff0c;对运行中的Java程序进行问题诊断和性能分析。 软件具体使用方法 1 启动 Arthas&#xff0c;此时可能会出现好几个jvm的进程号&#xff0c;输入序号…...

Go 1.19.4 路径和目录-Day 15

1. 路径介绍 存储设备保存着数据&#xff0c;但是得有一种方便的模式让用户可以定位资源位置&#xff0c;操作系统采用一种路径字符 串的表达方式&#xff0c;这是一棵倒置的层级目录树&#xff0c;从根开始。 相对路径&#xff1a;不是以根目录开始的路径&#xff0c;例如 a/b…...

jEasyUI 创建标签页

jEasyUI 创建标签页 jEasyUI&#xff08;jQuery EasyUI&#xff09;是一个基于jQuery的框架&#xff0c;它为Web应用程序提供了丰富的用户界面组件。标签页&#xff08;Tabs&#xff09;是jEasyUI中的一个常用组件&#xff0c;用于在一个页面内组织多个面板&#xff0c;用户可…...

鸿蒙HarmonyOS开发:一次开发,多端部署(界面级)天气应用案例

文章目录 一、布局简介二、典型布局场景三、侧边栏 SideBarContainer1、子组件2、属性3、事件 四、案例 天气应用1、UX设计2、实现分析3、主页整体实现4、具体代码 五、运行效果 一、布局简介 布局可以分为自适应布局和响应式布局&#xff0c;二者的介绍如下表所示。 名称简介…...

使用 Python 模拟光的折射,反射,和全反射

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

大厂太卷了!又一款国产AI视频工具上线了,免费无限使用!(附提示词宝典)

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 记得去年刚开始分享 AI 视频工具的时候&#xff0c;介绍的大多…...

vue3扩展echart封装为组件库-快速复用

ECharts ECharts&#xff0c;全称Enterprise Charts&#xff0c;是一款由百度团队开发并开源&#xff0c;后捐赠给Apache基金会的纯JavaScript图表库。它提供了直观、生动、可交互、可个性化定制的数据可视化图表&#xff0c;广泛应用于数据分析、商业智能、网页开发等领域。以…...

随机掉落的项目足迹:Vue3 + wangEditor5富文本编辑器——toolbar.getConfig() 查看工具栏的默认配置

问题引入 小提示&#xff1a;问题引入是一个讲故事的废话环节&#xff0c;各位小伙伴可以直接跳到第二大点&#xff1a;问题解决 我的项目不需要在富文本编辑器中引入添加代码块的功能&#xff0c;于是我寻思在工具栏上把操作代码的菜单删一删 于是我来到官网文档工具栏配置 …...

更新 Git 软件

更新 Git 软件本身是指将你当前安装的 Git 版本升级到最新版本。不同的操作系统有不同的更新方法。以下是针对 Windows、macOS 和 Linux 的 Git 更新步骤&#xff1a; Windows 检查当前版本&#xff1a; git --version访问官网下载最新版本&#xff1a; 访问 Git 官方网站 (ht…...

Keil根据map文件确定单片机代码存储占用flash情况

可以从map文件中查看得知&#xff0c;代码占用内存情况大概为35KB,而在在线仿真时&#xff0c;可以看到在flash的0x8008F64地址前均有数据&#xff0c;是代码数据&#xff0c;8F64(HEX)36708(DEC),36708/102335,刚好35。因此&#xff0c;要想操作读写flash&#xff0c;必须在不…...

ByteTrack多目标跟踪流程图

ByteTrack多目标跟踪流程图 点个赞吧&#xff0c;谢谢。...

什么是L2范数

定义&#xff1a; 在数学和计算中&#xff0c;L2 范数是一种用于测量向量长度或大小的方法&#xff0c;也被称为欧几里得范数。对于一个 n 维向量 x ( x 1 , x 2 , … , x n ) \mathbf{x} (x_1, x_2, \dots, x_n) x(x1​,x2​,…,xn​)&#xff0c;其 L2 范数定义为&#x…...

Scrapy爬虫IP代理池:提升爬取效率与稳定性

在互联网时代&#xff0c;数据就是新的黄金。无论是企业还是个人&#xff0c;数据的获取和分析能力都显得尤为重要。而在众多数据获取手段中&#xff0c;使用爬虫技术无疑是一种高效且广泛应用的方法。然而&#xff0c;爬虫在实际操作中常常会遇到IP被封禁的问题。为了解决这个…...

信息技术(IT)行业的发展

近年来&#xff0c;信息技术&#xff08;IT&#xff09;行业的发展呈现出前所未有的活力和潜力。随着全球数字化转型的加速&#xff0c;IT行业正逐步成为推动社会经济发展的重要引擎。无论是互联网、大数据、人工智能&#xff0c;还是云计算、物联网&#xff0c;这些新兴技术都…...

C++primer第十一章使用类(矢量随机游走实例)

操作符重载 操作符重载(operator overoading)是一种形式的 C多态。 第8章介绍了C是如何使用户能够定义多个名称相同但特征标(参数列表)不同的函数的。这被称为函数重载(function overloading)或函数多态(functional polymorphism)&#xff0c;旨在让您能够用同名的函数来完成…...

服务器为什么会受到网络攻击?

随着科技的 快速发展&#xff0c;企业也开展了越来越多的线上业务&#xff0c;但同时也遭受到各种各样的网络攻击&#xff0c;那服务器为什么会受到网络攻击呢&#xff1f;下面就让小编带领大家一起来了解一下吧&#xff01; 首先企业中服务器被攻击的原因有很多&#xff0c;主…...

IDA Pro基本使用

IDA Pro基本使用 1.DllMain的地址是什么? 打开默认在的位置1000D02E就是DllMain地址 按空格键可以看到图形化界面选择options、general勾选对应的选项在图像化也能看到 2.使用Imports 窗口并浏览到 gethostbyname&#xff0c;导入函数定位到什么地址? 这里可以打开Impo…...

Day.js时间插件的安装引用与常用方法大全

&#x1f680; 个人简介&#xff1a;某大型国企资深软件研发工程师&#xff0c;信息系统项目管理师、CSDN优质创作者、阿里云专家博主&#xff0c;华为云云享专家&#xff0c;分享前端后端相关技术与工作常见问题~ &#x1f49f; 作 者&#xff1a;码喽的自我修养&#x1f9…...