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

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息

一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样

RabbitMQ 服务,不是像其他服务器一样,负责逻辑处理,然后转发给客户端
而是所有客户端想要向 RabbitMQ服务发送消息,

第一步:创建一个链接 RabbitMQ 服务的连接

需要传入 RabbitMQ服务地址、用户名、密码,然后在连接代码中传入一个 queue 的字符串作为 标志
连接成功后,RabbitMQ服务上就可以看到这个链接了
如下图,可以看到有一个 Name = queueL1 的连接,后边有链接状态、消息数
Ready 和 Total 都是 0
在这里插入图片描述

向 RabbitMQ 发送消息的:

(1) 如果没有建立连接,执行第一步,建立一个链接
(2) 通过 发送消息接口向 RabbitMQ 服务 发消息
(3) RabbitMQ 服务接收到消息,只是按照连接的 queue 分别把消息放在自己名字的 queue 下, RabbitMQ 服务只是存着客户端发送的消息,服务什么都不处理

向 RabbitMQ 服务发送几条消息
下图可以看到 queueL1 的队列已经接收了 5 条消息,这五条消息如果没有客户端接收处理,就一直在这存着
在这里插入图片描述

接收 RabbitMQ 服务消息:

(1) 如果没有建立连接,执行第一步,建立一个链接
(2) 注册接收消息接口,在 RabbitMQ 中叫 消费消息,可以标记消费消息后是否将 RabbitMQ 的数据删除
(3) 如果 RabbitMQ 服务收到消息,就转发给 注册接收消息接口的 连接,如果接收的连接标记了 AutoDelete,那么发送给客户端后,RabbitMQ 就会将消息从消息队列中删除

注册接收消息,我的客户端就会收到 RabbitMQ 发送过来的消息,消息中包含发送上来的消息内容,还有发送消息的 queue 名字

此时再看,就会发现 Ready 和 Total 又变成 0 了
在这里插入图片描述

为什么上面讲解中将 接收 RabbitMQ 服务消息、向 RabbitMQ 发送消息的 分开说
是因为 RabbitMQ 发送消息就仅仅是发消息,发送完就不管了
而 RabbitMQ 的消费消息(接收消息) 也仅仅是接收消息,它不管是谁发的消息,只要是发送的 RabbitMQ 服务的消息,它都能接收,

(3.1) 比如我创建了 一个 连接,queue名为 xxxA,
它发送了消息 “Hello World”,
xxxA 连接自己又注册了 消费消息(接收消息),那么xxxA 自己就会接收到 xxxA 队列发送的 Hello World 信息

(3.2) 我又创建了 新的连接,queue 名还是 xxxA
那么新的连接也可以收到 (3.1) 发的 消息 HelloWorld

二. 客户端连接服务器
  1. 实例化一个 连接 RabbitMQ 服务的客户端连接
    实例化需要传入 服务地址、端口、用户名、密码

    using RabbitMQ.Client;
    using System;
    using System.Threading.Tasks;
    using RabbitMQ.Client.Exceptions;
    using UnityEngine;
    using System.Text;
    using RabbitMQ.Client.Events;

    namespace Network
    {
    ///
    /// RabbitMQ 创建一个链接
    /// 供 RabbitMQReceive、RabbitMQSend 使用
    ///
    public class RabbitMQConnect
    {
    private RabbitMQConnectData connectData;

        private ConnectionFactory factory;private IChannel channel;private IConnection connection;private NetWorkState state;private Action<string, byte[]> receivedCallBack;private const int TimeOut = 10; //连接超时 10 秒private bool dispose = false;public RabbitMQConnect(RabbitMQConnectData connectData){this.connectData = connectData;State = NetWorkState.Disconnected;dispose = false;}public string Queue{get { return connectData.queue; }}public NetWorkState State{get { return state; }private set { state = value; }}public IChannel Channel{get { return channel; }}/// <summary>/// 网络是否连接中/// </summary>public bool IsConnect{get{if (null == channel || null == connection){return false;}return channel.IsOpen && connection.IsOpen;}}public async Task StartConnect(){if (State == NetWorkState.Connecting){await Task.Delay(TimeOut * 1000);}if (State == NetWorkState.Connected){return;}// 创建连接工厂// 如果初始化失败,不会启动恢复连接//factory = new ConnectionFactory()//{//    HostName = hostName, // 替换为你的 RabbitMQ 服务器地址//    UserName = userName, // 替换为用户名//    Password = password  // 替换为密码//};string url = $"amqp://{connectData.userName}:{connectData.password}@{connectData.hostName}:{connectData.port}"; //string.Format("amqp://unity:unity@139.9.137.14:5672");factory = new ConnectionFactory(){Uri = new Uri(url)};// 自动恢复连接factory.AutomaticRecoveryEnabled = true;// 如果由于异常导致恢复失败(例如RabbitMQ节点仍然不可达),它将在固定的时间间隔(默认为5秒)后重试。间隔时间可配置如下// Connection.CloseAsync 关闭的连接不会启动自动恢复连接factory.NetworkRecoveryInterval = TimeSpan.FromSeconds(10);factory.TopologyRecoveryEnabled = true;while (State != NetWorkState.Connected){if (!dispose){await Connect();}}await Task.Delay(1);if (!string.IsNullOrEmpty(connectData.receiveQueeu)){await BasicConsumer();}}private async Task Connect(){try{State = NetWorkState.Connecting;// 异步创建连接connection = await factory.CreateConnectionAsync();channel = await connection.CreateChannelAsync();// 声明队列QueueDeclareOk queueDeclareOk = await channel.QueueDeclareAsync(queue: connectData.queue,durable: false,exclusive: false,autoDelete: false,arguments: null);/*autoDelete = true:没有消费者时队列自动删除,通常用于临时或一次性的队列。autoDelete = false:队列不会自动删除,通常用于需要长期存在的队列。选择是否设置 autoDelete = true 取决于你是否希望队列在没有消费者时自动删除。如果你的队列是临时的、一次性的,那么使用 autoDelete = true 会更适合;如果队列是长期需要使用的,则设置为 autoDelete = false 会更为合适 */State = NetWorkState.Connected;// 设置消费者的预取计数为10,允许同时处理10条消息await channel.BasicQosAsync(prefetchSize: 0, prefetchCount: 10, global: false);Debug.Log("RabbitMQ Connect Success");GameNotifycation.GetInstance().Notify<NetWorkState>(ENUM_MSG_TYPE.MSG_NETWORK_STATE_CHANGE, State);}catch (BrokerUnreachableException e){await Task.Delay(5000);State = NetWorkState.ConnectFailed;Debug.LogError("ConnectError:" + e.ToString());// apply retry logic}await Task.Delay(1);}/// <summary>/// 发送消息/// exchange:   要发布消息的交换机名称。/// routingKey: 路由键,决定消息应该路由到哪个队列。/// mandatory:  如果设置为 true,RabbitMQ 会确保消息至少被投递到一个队列。如果没有队列接收该消息,RabbitMQ 会触发 basic.return。/// immediate:  如果设置为 true,RabbitMQ 会在消息无法立即被消费时丢弃消息。/// basicProperties: 消息的属性,类型为 IBasicProperties。这些属性可以设置消息的优先级、持久性等。/// body: 消息体的字节数组。/// /// BasicPublishAsync 方法 没有返回消息投递的结果。它仅仅表示“请求已经被成功发送到 RabbitMQ 的交换机”。如果发布操作成功,Task 会正常完成,不会抛出异常。你可以通过异常处理来捕获潜在的错误。/// </summary>/// <param name="msg"></param>public async Task SendAsync(string message){if (!IsConnect){UnityEngine.Debug.Log("Send not IsConnect");await StartConnect();}try{IChannel channel = Channel;var body = Encoding.UTF8.GetBytes(message);var props = new BasicProperties();props.ContentType = "text/plain";props.DeliveryMode = DeliveryModes.Transient;await channel.BasicPublishAsync(exchange: "",routingKey: Queue,mandatory: false,basicProperties: props,body: body).ConfigureAwait(false);//Debug.Log($"[x] Sent: Complete");}catch (Exception ex){UnityEngine.Debug.LogError($"Error publishing message: {ex.Message}");}}/// <summary>/// 设置接收消息回调/// </summary>/// <param name="receivedCallBack"></param>public void SetReceive(Action<string, byte[]> receivedCallBack){this.receivedCallBack = receivedCallBack;}/// <summary>/// 创建异步消费者/// </summary>/// <returns></returns>public async Task<string> BasicConsumer(){if (!IsConnect){await StartConnect();}var consumer = new AsyncEventingBasicConsumer(Channel);// 处理消息的异步回调逻辑consumer.ReceivedAsync += ReceivedAsync;// 开始消费string result = await Channel.BasicConsumeAsync(queue: connectData.receiveQueeu,  // 指定消费者要监听的队列名称autoAck: false,        // 决定是否自动确认消息。如果 true,消息在交付时会自动确认。如果 false,则需要手动调用 BasicAck 确认消息consumer: consumer);  // 指定消息的处理方式,通过实现 IBasicConsumer 接口来定义如何处理从队列中接收到的消息/*autoAck = true:消息一旦传递给消费者,RabbitMQ 就认为该消息被成功处理,无需再确认。autoAck = false:消费者需要显式地调用 channel.BasicAck 来确认消息的处理,通常用于消息处理失败时能够重试消息。*/return result;}/// <summary>/// 异步接收消息/// 如果 Channel.BasicConsumeAsync 方法中 autoAck 设置为 true,那么 channel.BasicAckAsync 调用是不允许的/// 想在  Channel.BasicConsumeAsync 消费消息收到消息时 调用 channel.BasicAckAsync,必须将 Channel.BasicConsumeAsync 方法中 autoAck 设置为 false/// </summary>/// <param name="sender"></param>/// <param name="eventArgs"></param>/// <returns></returns>private async Task ReceivedAsync(object sender, BasicDeliverEventArgs eventArgs){try{//Debug.Log("ReceivedAsync");AsyncEventingBasicConsumer consumer = sender as AsyncEventingBasicConsumer;string queue = consumer.Channel.CurrentQueue;var body = eventArgs.Body.ToArray();receivedCallBack?.Invoke(queue, body);// 模拟异步任务处理(比如访问数据库或调用其他服务)await channel.BasicAckAsync(eventArgs.DeliveryTag, false);}catch (Exception ex){Debug.LogError($"Error processing message: {ex.Message}");// 如果处理失败,可以拒绝并重新入队(可选)//await Channel.BasicNackAsync(eventArgs.DeliveryTag, multiple: false, requeue: true);}await Task.Delay(1);}/// <summary>/// 关闭连接/// </summary>public async void Dispose(){dispose = true;// 先关闭通道、再关闭连接if (channel != null)  // 通道关闭{await channel.CloseAsync();channel = null;}if (connection != null)  // 连接关闭{UnityEngine.Debug.Log("ConnectDispose");await connection.CloseAsync();connection = null;}await Task.Delay(1);}
    }
    

    }

RibbitMQ 服务通过 queue 来区分每一个连接的客户端,代码部分如下

QueueDeclareOk queueDeclareOk = await channel.QueueDeclareAsync(queue: queue,durable: false,exclusive: false,autoDelete: false,arguments: null);
  1. 客户端实例

  2. 测试用例

    using UnityEngine;
    using Network;
    using LitJson;
    using System.Text;
    using System.Collections;
    using System.Collections.Generic;

    public class RabbitMQDemo : MonoBehaviour
    {
    // 客户端
    private RabbitMQConnect rabbitMQConnect;
    private Queue receiveQueue = new Queue();

    void Start()
    {RabbitMQConnectData connectData = new RabbitMQConnectData();connectData.queue = "TestA";connectData.receiveQueeu = "TestA";connectData.hostName = "XXX.XXX.XXX.XXX";connectData.port = "5672";connectData.userName = "unity";connectData.password = "unity";// 实例化rabbitMQConnect = new RabbitMQConnect(connectData);rabbitMQConnect.SetReceive(Receive);StartConnect();
    }private async void StartConnect()
    {await rabbitMQConnect.StartConnect();
    }private async void Send(string meg)
    {await rabbitMQConnect.SendAsync(meg);
    }private void Receive(string queue, byte[] byteData)
    {var json = Encoding.UTF8.GetString(byteData);UnityEngine.Debug.Log($"[x] ReceivedAsync: {json}");receiveQueue.Enqueue(netWorkData);
    }private int number = 1000;
    // Update is called once per frame
    void Update()
    {if (Input.GetKeyDown(KeyCode.A)){++number;Send("Hello RabbitMQ:" + number);}DispatchMessage();
    }private void DispatchMessage()
    {if (receiveQueue.Count <= 0){return;}string json = receiveQueue.Dequeue();
    }private void OnDestroy()
    {Debug.LogError("OnDestroy");rabbitMQConnect.Dispose();
    }
    

    }

    /// <summary>
    /// 网络连接状态
    /// </summary>
    public enum NetWorkState
    {// init/// <summary>/// 关闭/断开连接/// </summary>Closed,// client/// <summary>/// 已经建立连接/// </summary>Connected,/// <summary>/// 正在请求连接/// </summary>Connecting,/// <summary>/// 连接失败/// </summary>ConnectFailed,// both/// <summary>/// 连接超时/// </summary>Timeout,/// <summary>/// 断开连接/// </summary>Disconnected,
    }
    

扩展
可以在 网页上 Overview 页面,找到 Ports and contexts 部分
可以看到每种协议对应的端口是不一样的
每种协议都有一种独立的连接方式
需要根据自己选择的协议拼接路径

比如 我上面代码使用的 http 方式

    string localHost = "localhost"; // ip如 xxx.xxx.xxx.xxxstring userName = "用户名";string password = "密码";// 创建连接工厂// 如果初始化失败,不会启动恢复连接factory = new ConnectionFactory(){HostName = hostName, // 替换为你的 RabbitMQ 服务器地址UserName = userName, // 替换为用户名Password = password  // 替换为密码};

amqp 协议连接方式如下

	string url = $"amqp://{userName}:{password}@{hostName}:{port}"; factory = new ConnectionFactory(){Uri = new Uri(url)};

在这里插入图片描述

相关文章:

RabbitMQ 客户端 连接、发送、接收处理消息

RabbitMQ 客户端 连接、发送、接收处理消息 一. RabbitMQ 的机制跟 Tcp、Udp、Http 这种还不太一样 RabbitMQ 服务&#xff0c;不是像其他服务器一样&#xff0c;负责逻辑处理&#xff0c;然后转发给客户端 而是所有客户端想要向 RabbitMQ服务发送消息&#xff0c; 第一步&a…...

SQL ON与WHERE区别

在 MySQL 中&#xff0c;ON 和 WHERE 都用于过滤数据&#xff0c;但它们的使用场景和作用有所不同&#xff0c;尤其是在涉及 JOIN 操作时。下面通过具体的例子来说明它们的区别。 1. ON 的作用 ON 用于指定表之间的连接条件&#xff0c;决定哪些行应该被连接在一起。它在 JOI…...

[创业之路-254]:《华为数字化转型之道》-1-华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。

前言&#xff1a; 华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。华为的流程大到战略&#xff0c;小到日常工作&#xff0c;是由无数个自我调节自我优化的数字化闭环控制流程组成&#xff0c;大闭环套小闭环&#xff0…...

免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)

哈喽大家好&#xff0c;欢迎来到虚拟化时代君&#xff08;XNHCYL&#xff09;&#xff0c;收不到通知请将我点击星标&#xff01;“ 大家好&#xff0c;我是虚拟化时代君&#xff0c;一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…...

异步任务与定时任务

一、异步任务 基于TaskExecutionAutoConfiguration配置类中&#xff0c;注册的ThreadPoolTaskExecutor线程池对象进行异步任务执行。 (一)手动执行异步任务 在yml中配置线程池参数 spring: task:execution:pool:core-size: 5 # 核心线程数max-size: 20 # 最大线…...

大模型WebUI:Gradio全解11——Chatbot:融合大模型的多模态聊天机器人(5)

大模型WebUI&#xff1a;Gradio全解11——Chatbot&#xff1a;融合大模型的多模态聊天机器人&#xff08;5&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.5 Chatbot的特殊Events11.5.1 各事件总演示11.5.2 详解.undo、.retry、.like和.edit…...

32单片机综合应用案例——基于GPS的车辆追踪器(三)(内附详细代码讲解!!!)

困难不会永远存在&#xff0c;只要你勇于面对&#xff0c;坚持努力&#xff0c;就一定能够战胜一切困难。每一次挑战都是一次成长的机会&#xff0c;不要害怕失败&#xff0c;失败是成功之母。只有经历过失败&#xff0c;你才能更加明白自己的不足&#xff0c;并不断改进自己&a…...

扣除价格因素与剔除季节性因素:统计数据中的“真实”增长(中英双语)

扣除价格因素与剔除季节性因素&#xff1a;统计数据中的“真实”增长 在经济统计分析中&#xff0c;我们经常会听到“扣除价格因素”和“剔除季节性因素”这两个概念。这两者都是为了排除外部干扰因素&#xff0c;真实反映经济活动的增长情况。它们分别针对价格波动和季节性波…...

网卡接收报文的过程

网卡接收报文的过程通常包括以下几个关键步骤&#xff1a; 1. 硬件接收&#xff1a; • 网卡硬件首先接收到从网络传输过来的数据包。网络接口卡&#xff08;NIC&#xff09;负责将接收到的电信号转换为数字信号&#xff0c;并存储到一个硬件缓冲区中。 2. DMA传输&#xff…...

Windows图形界面(GUI)-QT-C/C++ - QT 对话窗口

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 模态对话框 非模态对话框 文件对话框 基本概念 静态函数 常见属性 颜色对话框 基本概念 静态函数 常见属性 字体对话框 基本概念 静态函数 常见属性 输入对话框 基本概念 …...

bypass--2025春秋杯冬季赛

漏洞点 题目不难&#xff0c;这个循环赋值的结束条件是s[i]0&#xff0c;并且s和key再栈上的位置是挨着的 那么很容易想到&#xff0c;第二次循环赋值的时候&#xff0c;有一个溢出&#xff0c;溢出部分的值是第一次写入的key的值。 那么基本思路就是&#xff0c;利用这段溢出…...

学习微信小程序的下拉列表控件-picker

1、创建一个空白工程 2、index.wxml中写上picker布局&#xff1a; <!--index.wxml--> <view class"container"><picker mode"selector" range"{{array}}" bindchange"bindPickerChange"><view class"pick…...

【17】Word:林楚楠-供应链❗

目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为&#xff1a;文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式&#xff1a;形状轮廓…...

父子盒子滑动事件穿透问题

问题描述 当父子盒子都有滚动条时&#xff0c;在子盒子内滚动时&#xff0c;父盒子滚动子盒子无法滚动&#xff0c;直到父盒子滚动到底部&#xff0c;子盒子才滚动 解决 如果是vue的项目&#xff0c;直接在子盒子上添加 wheel.stop""...

vue-amap、leaflet、融汇 离线地图瓦片使用情况分析

vue-amap&#xff1a; vue3写的&#xff0c;使用文档 -> 文档地址 <-的离线jsApi里的demo&#xff0c;发现 tile-url不能读取本地项目文件夹里的瓦片&#xff0c;文档里写的其实还是要互联网读取的高德瓦片......... 作者在git库回复tile-url要么放项目里使用绝对路…...

leetcode - 1055. Shortest Way to Form String

Description A subsequence of a string is a new string that is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (i.e., “ace” is a subsequence of “abcd…...

【HarmonyOS之旅】基于ArkTS开发(二) -> UI开发三

目录 1 -> 绘制图形 1.1 -> 绘制基本几何图形 1.2 -> 绘制自定义几何图形 2 -> 添加动画效果 2.1 -> animateTo实现闪屏动画 2.2 -> 页面转场动画 3 -> 常见组件说明 1 -> 绘制图形 绘制能力主要是通过框架提供的绘制组件来支撑&#xff0c;支…...

RabbitMQ 进阶

文章目录 一、发送者的可靠性 1.1 生产者重试机制&#xff1a;1.2 生产者确认机制&#xff1a; 1.2.1 开启生产者确认&#xff1a;1.2.2 定义 ReturnCallback&#xff1a;1.2.3 定义 ConfirmCallback&#xff1a; 二、MQ 的可靠性 2.1 数据持久化&#xff1a; 2.1.1 交换机持…...

RabbitMQ---TTL与死信

&#xff08;一&#xff09;TTL 1.TTL概念 TTL又叫过期时间 RabbitMQ可以对队列和消息设置TTL&#xff0c;当消息到达过期时间还没有被消费时就会自动删除 注&#xff1a;这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身&#xff0c;不是说队列过期时间…...

uniapp(小程序、app、微信公众号、H5)预览下载文件(pdf)

1. 小程序、app 在uniapp开发小程序环境或者app环境中,都可以使用以下方式预览文件 之前其实写过一篇,就是使用uniapp官网提供文件下载、文件保存、文件打开的API, uniapp文件下载 感兴趣也可以去看下 uni.downloadFile({// baseURL 是...

Spring Boot经典面试题及答案

一、Spring Boot基础知识 什么是Spring Boot&#xff1f; 答案&#xff1a; Spring Boot是Spring开源组织下的子项目&#xff0c;是Spring组件一站式解决方案。它简化了Spring应用程序的初始化和开发过程&#xff0c;通过“约定大于配置”的原则&#xff0c;减少了手动配置的繁…...

usb通过hdc连接鸿蒙next的常用指令

参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…...

FPGA:Quartus软件与操作系统版本对照表

文章目录 1.软件概述2.软件版本3.设计流程4.支持的设备5.新特性6.版本对照 1.软件概述 Quartus软件是由英特尔&#xff08;Intel&#xff09;公司开发的一款功能强大的FPGA&#xff08;现场可编程逻辑门阵列&#xff09;设计工具&#xff0c;广泛应用于数字电路设计、仿真、综…...

RustDesk ID更新脚本

RustDesk ID更新脚本 此PowerShell脚本自动更新RustDesk ID和密码&#xff0c;并将信息安全地存储在Bitwarden中。 特点 使用以下选项更新RustDesk ID&#xff1a; 使用系统主机名生成一个随机的9位数输入自定义值 为RustDesk生成新的随机密码将RustDesk ID和密码安全地存储…...

[C语言]字符串分离

题目 从标准输入流&#xff08;控制台&#xff09;中获取一行字符串 str&#xff0c;字符串中可能会存在空格&#xff0c;现在需要将字符串进行分离&#xff0c;规则如下&#xff1a; (1)将 str 中位于 偶数下标 的元素放置在字符串 str1 之中 (2)将 str 中位于 奇数下标 的…...

-bash: /java: cannot execute binary file

在linux安装jdk报错 -bash: /java: cannot execute binary file 原因是jdk安装包和linux的不一致 程序员的面试宝典&#xff0c;一个免费的刷题平台...

Python绘制数据地图-GeoPandas入门

使用GeoPandas绘制数据地图是一种非常直观且强大的数据可视化方法。GeoPandas是一个Python库&#xff0c;专门用于处理地理空间数据&#xff0c;它建立在Pandas和Shapely库之上&#xff0c;并集成了matplotlib、seaborn等绘图库的功能。 下面是一个简单的入门教程&#xff0c;…...

CVPR 2024 图像处理方向总汇(图像去噪、图像增强、图像分割和图像恢复等)

1、Image Progress(图像处理) 去鬼影 Generating Content for HDR Deghosting from Frequency View去阴影 HomoFormer: Homogenized Transformer for Image Shadow Removal去模糊 Unsupervised Blind Image Deblurring Based on Self-EnhancementLatency Correction for E…...

c++ string

1 sting 基本概念 string 基本概念 本质&#xff1a;string是c风格的字符串&#xff0c;而string 本质上是一个类string 和char* 的区别&#xff1a; char * 是一个指针 string 是一个类&#xff0c;类内部封装了char*&#xff0c;管理这个字符串&#xff0c;是一个char* 数组…...

tomcat文件目录讲解

目录的用处 bin&#xff1a;tomcat的可执行命令&#xff0c;比如&#xff1a;tomcat的启动停止命令&#xff0c;也包含其他命令以及.bat&#xff08;Windows执行的命令&#xff09;和.sh&#xff08;Linux操作系统执行的命令&#xff09;文件config:关于tomcat的配置&#xff0…...

博客搭建 — GitHub Pages 部署

关于 GitHub Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;通过构建过程运行文件&#xff0c;然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…...

【0x0052】HCI_Write_Extended_Inquiry_Response命令详解

目录 一、命令概述 二、命令格式及参数 2.1. HCI_Write_Extended_Inquiry_Response命令格式 2.2. FEC_Required 2.3. Extended_Inquiry_Response 三、生成事件及参数 3.1. HCI_Command_Complete 事件 3.2. Status 四、命令执行流程 4.1. 命令准备阶段(主机端) 4.2…...

Kotlin Bytedeco OpenCV 图像图像55 图像透视变换

Kotlin Bytedeco OpenCV 图像图像53 图像透视变换 1 添加依赖2 测试代码3 测试结果 1 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://maven.apa…...

flutter Get GetMiddleware 中间件不起作用问题

当使用 get: ^5.0.0-release-candidate-9.2.1最新版本时&#xff0c;中间件GetMiddleware各种教程都是让我们在redirect中实现&#xff0c;比如&#xff1a; overrideRouteSettings? redirect(String? route) {return RouteSettings(name: "/companyAuthIndexPage"…...

npm介绍

npm&#xff08;Node Package Manager&#xff09;是 Node.js 的默认包管理工具&#xff0c;用于管理 JavaScript 和 Node.js 项目的依赖关系。它既是一个包管理工具&#xff0c;又是一个在线仓库&#xff0c;开发者可以通过它分享和下载开源的 JavaScript 库和工具。npm 是世界…...

Ruby语言的数据结构

Ruby语言的数据结构详解 Ruby是一种动态、面向对象的编程语言&#xff0c;因其简洁优雅的语法而受到开发者的喜爱。在Ruby中&#xff0c;数据结构是构建和管理数据的一种方式&#xff0c;不同的数据结构适用于不同的场景。本文将详细探讨Ruby中的几种主要数据结构&#xff0c;…...

web开发工具之:一、UUID的介绍,java如何产生UUID,作为数据库的主键和加密算法的盐

文章目录 前言一、UUID是什么二、java如何产生UUID1. 生成随机 UUID&#xff08;Version 4&#xff09;2. 通过指定的字符串生成 UUID 三、UUID作为数据库主键1. 优点2. 缺点 四、UUID作为加密的盐总结 前言 现在web开发中&#xff0c;很多使用UUID作为主键和加密的盐的&#…...

精度论文:【Focaler-IoU: More Focused Intersection over Union Loss】

Focaler-IoU: 更聚焦的交并比损失 Focaler-IoU: More Focused Intersection over Union Loss Focaler-IoU: 更聚焦的交并比损失I. 引言II. 相关工作III. 方法IV. 实验V. 结论 原文地址&#xff1a;官方论文地址 代码地址&#xff1a;官方代码地址 摘要——边界框回归在目标检…...

Android-目前最稳定和高效的UI适配方案

谈到适配&#xff0c;首先需要介绍几个基本单位&#xff1a; 1、密度无关像素&#xff08;dp&#xff09;&#xff1a; 含义&#xff1a;density-independent pixel&#xff0c;叫dp或dip&#xff0c;与终端上的实际物理像素点无关 单位&#xff1a;dp&#xff0c;可以保证在…...

Realsense相机驱动安装及其ROS通讯配置——机器人抓取系统基础系列(四)

文章目录 概要1 Realsense相机驱动安装Method1: 使用Intel服务器预编译包Method2: 使用ROS服务器预编译包Method3: 使用SDK源代码方法对比总结 2 Realsense-ROS通讯配置与使用2.1 Realsense-ROS包安装2.2 ROS节点启动 小结Reference 概要 本文首先阐述了Realsense相机驱动安装…...

docker安装Nginx UI

开源地址&#xff1a;nginx-ui/README-zh_CN.md at dev 0xJacky/nginx-ui GitHub docker run -dit \ --namenginx-ui \ --restartalways \ -e TZAsia/Shanghai \ -v /Users/xiaoping/docker/appdata/nginx:/etc/nginx \ -v /Users/xiaoping/docker/appdata/nginx-ui:/etc/ng…...

【AI】【RAG】使用WebUI部署RAG:数据优化与设置技巧详解

RAG(Retrieval-Augmented Generation)是一种通过知识库构建的高效问答系统。然而,在使用WebUI部署和优化RAG时,数据源管理和参数设置直接决定了系统的回答质量。本文将结合具体问题和优化方法,为您详细解读如何最大化RAG的性能和准确性。 数据源相关问题及解决方案 在实际…...

如何在vue中渲染markdown内容?

文章目录 引言什么是 markdown-it&#xff1f;安装 markdown-it基本用法样式失效&#xff1f;解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中&#xff0c;Markdown 作为一种轻量级的标记语言&#xff0c;广泛用于文档编写、内容管理以及富文本编辑器中。markdown…...

nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

一、安装nvm 1. 下载nvm nvm-windows官网地址https://github.com/coreybutler/nvm-windows/releases ​ 如果打不开也可以到这里下载 2.双击 nvm-setup.exe 开始安装 ​ 3.选择nvm安装路径&#xff0c;路径名称不要有空格&#xff0c;然后点击next 4.node.js安装…...

机器学习-归一化

文章目录 一. 归一化二. 归一化的常见方法1. 最小-最大归一化 (Min-Max Normalization)2. Z-Score 归一化&#xff08;标准化&#xff09;3. MaxAbs 归一化 三. 归一化的选择四. 为什么要进行归一化1. 消除量纲差异2. 提高模型训练速度3. 增强模型的稳定性4. 保证正则化项的有效…...

一次完整的tcpdump -XX输出报文详解

报文&#xff1a; 03:32:51.745623 IP (tos 0x0, ttl 64, id 65006, offset 0, flags [DF], proto TCP (6), length 94) 10.229.43.200.6471 > 10.229.43.200.55674: Flags [P.], cksum 0x6daa (incorrect -> 0x2e06), seq 1:43, ack 42, win 3635, options [nop,nop…...

【STM32-学习笔记-9-】SPI通信

文章目录 SPI通信Ⅰ、SPI通信概述1、SPI技术规格2、SPI应用 3、硬件电路移位示意图 Ⅱ、SPI时序基本单元①、起始条件②、终止条件③、交换一个字节&#xff08;模式0&#xff09;④、交换一个字节&#xff08;模式1&#xff09;⑤、交换一个字节&#xff08;模式2&#xff09;…...

kalilinux - 目录扫描之dirsearch

情景导入 先简单介绍一下dirsearch有啥用。 假如你现在访问一个网站&#xff0c;例如https://www.example.com/ 它是一个电商平台或者其他功能性质的平台。 站在开发者的角度上思考&#xff0c;我们只指导https://www.example.com/ 但不知道它下面有什么文件&#xff0c;文…...

(12)springMVC文件的上传

SpringMVC文件上传 首先是快速搭建一个springMVC项目 新建项目mvn依赖导入添加webMoudle添加Tomcat运行环境.在配置tomcat时ApplicationContext置为"/"配置Artfact的lib配置WEB-INF配置文件&#xff08;记得添加乱码过滤&#xff09;配置springmvc-servlet文件&…...

[Mac + Icarus Verilog + gtkwave] Mac运行Verilog及查看波形图

目录 1. MAC安装环境 1. 1 Icarus Verilog 编译 1. 2 gtkwave 查看波形 2. 安装遇到的问题 2. 1 macOS cannot verify that this app is free from malware 2. 2 gtkwave-bin is not compatible with macOS 14 or later 3. 运行示例 3. 1 源代码 3. 2 编译Verilog 3. 3 生成.v…...