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

JSON-RPC-CXX深度解析:C++中的远程调用利器

一、引言

1. JSON-RPC 简介及其在 C++ 开发中的重要性

JSON-RPC(JavaScript Object Notation - Remote Procedure Call)是一种基于 JSON 格式的远程过程调用协议。在 C++ 开发中,它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的广泛应用,高效的远程过程调用成为构建强大应用程序的关键。JSON-RPC 以其简洁的 JSON 数据格式,使得不同的系统之间可以轻松地进行通信,而无需关心底层的网络细节和数据传输方式。

在 C++ 开发中,JSON-RPC 为开发者提供了一种跨平台、高效且灵活的远程调用解决方案。它允许 C++ 程序与其他语言编写的程序进行无缝交互,促进了多语言环境下的软件开发。同时,JSON-RPC 的轻量级特性使其在资源受限的环境中也能表现出色,适用于各种类型的 C++ 项目,从嵌入式系统到高性能服务器应用。

2. 引入 json-rpc-cxx 库的独特价值

json-rpc-cxx 库作为一个开源的 C++ 实现,为 C++ 开发者带来了诸多独特价值。首先,它严格遵循 JSON-RPC 协议,确保了与其他符合该协议的系统的兼容性。该库提供了丰富的功能,方便地定义可远程调用的函数,处理客户端和服务器之间的 JSON 数据序列化和反序列化,以及支持多种网络传输方式或可与其他网络库集成。

json-rpc-cxx 库的跨平台兼容性也是其一大优势。无论是在 Windows、Linux 还是 OSX 上,都能无缝运行,为开发者提供了极大的便利。此外,它利用了流行的 nlohmann::json 库,确保了数据处理的高效性和便捷性。同时,该库的设计充分考虑了类型安全和编译时错误检查,减少了运行时问题,提升了开发效率。

  • json-rpc-cxx 开源库链接

二、JSON-RPC-CXX 库概述

1. 严格遵循 JSON-RPC 协议,实现跨网络通信

json-rpc-cxx 库严格遵循 JSON-RPC 2.0 规范,确保了在不同的网络环境下,客户端和服务器能够进行稳定且高效的通信。通过使用 JSON 格式作为数据交换格式,它克服了不同编程语言和系统之间的差异,使得跨网络通信变得轻而易举。

JSON-RPC 协议定义了一种简洁而有效的方式来进行远程过程调用。在 json-rpc-cxx 库的实现中,客户端可以通过发送包含方法名和参数的 JSON 请求,向服务器发起远程调用。服务器接收到请求后,解析 JSON 数据,执行相应的方法,并将结果以 JSON 格式返回给客户端。这种方式不仅使得通信过程清晰明了,而且易于理解和调试。

2. 丰富功能列举

  • 方便定义远程调用函数:json-rpc-cxx 库提供了简洁的接口,使得开发者可以轻松地定义可远程调用的函数。通过继承 jsonrpccxx::JsonRpcServer 类,并使用 BindMethod 函数,开发者可以将 C++ 的函数绑定为远程可调用的方法。例如,可以像这样定义一个加法函数:BindMethod("add", [](int num1, int num2) { return num1 + num2; });。这种方式使得 C++ 程序中的函数可以被其他系统通过网络远程调用,极大地提高了程序的可扩展性和灵活性。
  • 处理 JSON 数据序列化反序列化:该库利用流行的 nlohmann::json 库,高效地处理 JSON 数据的序列化和反序列化。在客户端和服务器之间进行通信时,需要将数据转换为 JSON 格式进行传输。json-rpc-cxx 库能够自动地将 C++ 的数据类型转换为 JSON 格式,并在接收到 JSON 数据时,将其反序列化为 C++ 的数据类型。这样,开发者无需手动处理数据的转换过程,大大提高了开发效率。
  • 支持多种网络传输方式:json-rpc-cxx 库具有很强的灵活性,支持多种网络传输方式。它可以与不同的网络库集成,如 HTTP、WebSocket 等。这使得开发者可以根据具体的应用场景选择最适合的网络传输方式。例如,在需要实时通信的场景下,可以选择 WebSocket 传输方式;而在传统的基于请求 - 响应的场景下,HTTP 可能是更好的选择。这种灵活性使得 json-rpc-cxx 库能够适应各种不同的网络环境和应用需求。

三、服务器端应用

在构建基于json-rpc-cxx库的服务器端应用时,我们需要关注几个关键步骤:创建服务器、定义服务方法以及启动服务器。下面将详细介绍这些步骤。

(一)创建服务器

包含必要头文件及作用介绍

在服务器端代码中,包含的头文件如jsonrpccxx/server.hjsonrpccxx/server_connector.h起着至关重要的作用。

  • jsonrpccxx/server.h:提供了创建服务器的类和相关函数,使我们能够构建一个JSON-RPC服务器实例,以监听客户端的请求并进行相应的处理。
  • jsonrpccxx/server_connector.h:提供了服务器连接相关的类和函数,用于实现服务器与客户端之间的连接管理。

以HttpServer为例创建服务器实例,监听指定端口

json-rpc-cxx库提供了不同类型的服务器类,以HttpServer为例,我们可以在特定端口创建服务器实例。假设我们要在端口8080创建服务器,可以使用以下代码:

jsonrpccxx::HttpServer httpServer(8080);

这样就创建了一个基于HTTP协议监听在8080端口的服务器对象,等待客户端的连接和请求。

(二)定义服务方法

创建继承JsonRpcServer的类,用于定义可被客户端调用的方法

为了定义可被客户端调用的方法,我们可以创建一个继承自jsonrpccxx::JsonRpcServer的类。这个类可以封装特定的业务逻辑,并将其暴露为远程可调用的方法。

通过BindMethod函数绑定具体方法,如加法函数示例

在继承自jsonrpccxx::JsonRpcServer的类中,我们可以使用BindMethod函数将C++的函数绑定到特定的方法名上。例如,定义一个加法函数并绑定到名为add的方法上,可以这样实现:

BindMethod("add", [](int num1, int num2) { return num1 + num2; });

这样,当客户端通过JSON-RPC请求调用add方法时,服务器将执行这个加法函数并返回结果。

(三)启动服务器

在main函数中启动服务器并保持运行的逻辑

main函数中,我们可以启动服务器并使其保持运行,以持续监听客户端的请求。

  1. 创建服务器实例和服务类实例
jsonrpccxx::HttpServerConnector serverConnector(8080);
MyService service(serverConnector);
  1. 调用StartListening启动服务器监听
service.StartListening();
std::cout << "Server started on port 8080." << std::endl;

当调用StartListening函数后,服务器会进入监听状态,等待客户端的连接和请求。一旦有请求到达,服务器会根据请求的方法名和参数执行相应的方法,并将结果返回给客户端。

  1. 保持服务器运行

为了保持服务器运行,可以使用一个循环,例如while (true) {}。这个循环只是一个简单的示例,在实际应用中,可能需要更好的服务器运行管理逻辑,比如使用信号处理来优雅地停止服务器。

  1. StartListening和StopListening函数的作用
  • StartListening:启动服务器的监听,使服务器开始接收客户端的请求。
  • StopListening:停止服务器的监听。在服务器运行过程中,如果需要停止服务器,可以调用这个函数来释放资源并结束服务器进程。

服务端示例

以下是使用json-rpc-cxx库创建服务器的详细代码示例:

#include <iostream>
#include "jsonrpccxx/server.h"
#include "jsonrpccxx/server_connector.h"
#include "jsonrpccxx/http_server_connector.h"class MyService : public jsonrpccxx::JsonRpcServer
{
public:MyService(jsonrpccxx::ServerConnector& serverConnector): jsonrpccxx::JsonRpcServer(serverConnector){BindMethod("add", [](int num1, int num2) {return num1 + num2;});}
};int main()
{jsonrpccxx::HttpServerConnector serverConnector(8080);MyService service(serverConnector);service.StartListening();std::cout << "Server started on port 8080." << std::endl;while (true) {}service.StopListening();return 0;
}

在这个示例中,我们创建了一个基于HTTP的服务器,定义了一个名为add的远程方法,该方法接受两个整数参数并返回它们的和。服务器启动后会一直运行,直到程序被手动终止。

四、客户端应用

在 JSON-RPC 通信中,客户端应用负责发起请求并处理服务器的响应。以下是如何使用 json-rpc-cxx 库来创建客户端应用并调用服务器上的远程方法的详细步骤。

(一)创建客户端连接

包含客户端所需头文件

在客户端代码中,首先需要包含必要的头文件。这些头文件提供了创建客户端和处理客户端连接相关功能的类和函数。

#include "jsonrpccxx/client.h"
#include "jsonrpccxx/client_connector.h"
#include "jsonrpccxx/http_client_connector.h"
  • jsonrpccxx/client.h 包含了客户端的主要实现类,如 jsonrpccxx::JsonRpcClient,用于发起远程过程调用。
  • jsonrpccxx/client_connector.h 提供了客户端连接的相关类,用于建立与服务器的连接。
  • jsonrpccxx/http_client_connector.h 是具体的 HTTP 客户端连接器实现。

以 HttpClient 创建连接对象,指向服务器地址

接下来,使用 HttpClient 创建客户端连接对象。假设服务器在本地运行且监听在端口 8080,可以使用以下代码创建连接对象:

jsonrpccxx::HttpClientConnector client("http://127.0.0.1:8080");

这里创建了一个指向本地 8080 端口的 HTTP 客户端连接对象,为后续创建 JSON-RPC 客户端实例和调用远程方法提供了基础。

(二)创建 JSON-RPC 客户端实例

使用创建好的客户端连接对象,可以创建 jsonrpccxx::JsonRpcClient 实例:

jsonrpccxx::JsonRpcClient rpcClient(client);

这个实例将用于调用服务器上的远程方法。通过这个实例,客户端可以发起 JSON-RPC 请求,将方法名和参数发送给服务器,并接收服务器返回的结果。

(三)调用远程方法

通过 CallMethod 函数调用服务器方法,处理可能的异常

通过 rpcClient 可以调用服务器上的方法。例如,调用 add 方法:

try
{int result = rpcClient.CallMethod<int>("add", 3, 4);std::cout << "Result of add: " << result << std::endl;
}
catch (const jsonrpccxx::JsonRpcException& e)
{std::cerr << "JSON-RPC Exception: " << e.what() << std::endl;
}

在上述代码中,CallMethod 函数用于调用服务器上的方法。它的模板参数指定了返回值类型,第一个参数是要调用的方法名称,后面的参数是传递给方法的参数。这里调用 add 方法并传递 34 作为参数。如果调用过程中出现 JSON-RPC 相关的异常,会被 catch 块捕获并输出错误信息。

客户端示例

以下是使用 json-rpc-cxx 库创建 HTTP 客户端的详细代码示例:

#include <iostream>
#include "jsonrpccxx/client.h"
#include "jsonrpccxx/client_connector.h"
#include "jsonrpccxx/http_client_connector.h"int main()
{// 创建 HTTP 客户端连接对象,连接到服务器(假设服务器在本地,端口为 8080)jsonrpccxx::HttpClientConnector client("http://127.0.0.1:8080");// 创建 JSON-RPC 客户端实例jsonrpccxx::JsonRpcClient rpcClient(client);try{// 调用服务器上的某个方法,这里假设服务器有一个名为 'add' 的方法,接受两个整数参数int result = rpcClient.CallMethod<int>("add", 3, 4);std::cout << "Result of add: " << result << std::endl;}catch (const jsonrpccxx::JsonRpcException& e){std::cerr << "JSON-RPC Exception: " << e.what() << std::endl;}return 0;
}

在这个示例中,客户端连接到本地运行在 8080 端口的 HTTP 服务器,并调用服务器上定义的 add 方法,传入两个参数 34,然后输出结果。如果调用过程中出现 JSON-RPC 相关的异常,会被捕获并输出错误信息。

五、错误处理

在分布式应用程序中,错误处理是确保系统稳定和可靠性的关键。无论是服务器端还是客户端,都需要对可能出现的错误进行细致处理。以下是如何在 JSON-RPC 应用程序中进行错误处理的详细指南。

(一)服务器端错误处理

方法内部对可能错误的处理

在服务器端方法内部,对可能出现的错误进行细致处理是确保系统稳定的关键。以除法运算为例,当方法涉及到可能出现除数为 0 的情况时,需要进行特别处理。

class MyService : public jsonrpccxx::JsonRpcServer
{
public:MyService(jsonrpccxx::ServerConnector& serverConnector): jsonrpccxx::JsonRpcServer(serverConnector){BindMethod("divide", [](int num1, int num2) {try {if (num2 == 0) {throw std::runtime_error("Division by zero");}return num1 / num2;} catch (const std::exception& e) {// 将异常信息作为错误消息返回给客户端return std::string("Error: ") + e.what();}});}
};

在上述代码中,divide 方法通过 try-catch 块进行异常处理。如果除数为 0,会抛出 std::runtime_error 异常,并在 catch 块中将错误信息以字符串形式返回给客户端。

设置全局异常处理函数

除了在方法内部处理错误,设置全局异常处理函数可以进一步增强服务器的稳定性。

class MyService : public jsonrpccxx::JsonRpcServer
{
public:MyService(jsonrpccxx::ServerConnector& serverConnector): jsonrpccxx::JsonRpcServer(serverConnector){// 设置全局异常处理函数SetExceptionHandler([](const std::exception& e) {return std::string("Internal server error: ") + e.what();});BindMethod("divide", [](int num1, int num2) {if (num2 == 0) {throw std::runtime_error("Division by zero");}return num1 / num2;});}
};

这里设置的全局异常处理函数,在捕获到未在方法内部处理的异常时,会将错误信息以特定格式返回给客户端。这样,即使某个方法没有正确处理异常,也能通过全局异常处理函数向客户端返回有意义的错误信息。

(二)客户端错误处理

使用 try-catch 块捕获 JsonRpcException 异常

在客户端调用远程方法时,使用 try-catch 块捕获 jsonrpccxx::JsonRpcException 异常是一种良好的编程习惯。

try {// 调用远程方法的代码
} catch (const jsonrpccxx::JsonRpcException& e) {std::cerr << "JSON-RPC Exception: " << e.what() << std::endl;// 可以根据错误码进行更详细的处理if (e.Code() == -32602) {std::cerr << "Invalid parameters." << std::endl;} else if (e.Code() == -32603) {std::cerr << "Internal error." << std::endl;}
} catch (const std::exception& e) {std::cerr << "Standard Exception: " << e.what() << std::endl;
}

在上述代码中,当捕获到 JsonRpcException 异常时,首先输出异常信息。然后,根据异常中的错误码进行更详细的错误处理。通过这种方式,可以更准确地定位和处理客户端在调用远程方法时出现的问题。

同时捕获标准异常处理其他问题

除了捕获 JsonRpcException 异常,还需要捕获其他可能的标准异常,以处理网络连接等其他问题。例如,在上述代码中,同时捕获了 std::exception 异常。这样,当出现其他未知的异常情况时,也能进行适当的处理。

六、总结

JSON-RPC 库,尤其是 json-rpc-cxx,在构建分布式应用程序中展现出诸多优势。以下是对 JSON-RPC 库优势的总结以及实际应用中的扩展方向。

1. JSON-RPC 库的优势

  • 高效便捷的远程过程调用:JSON-RPC 库提供了高效且便捷的远程过程调用方式,使得不同节点之间的通信变得简单而直接。
  • 跨平台兼容性json-rpc-cxx 在 Windows、Linux 和 OSX 上都能无缝运行,提高了开发效率和应用的可移植性。
  • 出色的数据处理能力:利用流行的 nlohmann::json 库,高效地处理 JSON 数据的序列化和反序列化,确保了数据在网络传输中的准确性和高效性。
  • 丰富的功能和灵活的选择:支持多种网络传输方式,为不同的应用场景提供了灵活的选择。
  • 全面的错误处理机制:服务器端和客户端都可以进行详细的错误处理,提高了系统的稳定性和可维护性。

2. 实际应用中的扩展方向

  • 添加更多复杂的远程方法:根据项目需求,添加更多复杂的远程方法以满足不同的业务需求。
  • 优化性能:通过调整网络传输参数、优化数据处理算法等方式,提高系统的响应速度和吞吐量。
  • 实现安全机制:添加身份验证和授权机制,确保只有合法的用户才能访问特定的远程方法。加密通信也是提高系统安全性的重要手段。

3. 利用文档和示例代码的重要性

  • 文档的重要性:文档提供了详细的使用说明和功能介绍,帮助开发者快速上手并深入理解库的功能特点。
  • 示例代码的重要性:示例代码展示了具体的应用场景和使用方法,为开发者提供了实际的参考。通过深入研究文档和示例代码,开发者可以更好地掌握库的使用技巧,避免常见的错误,提高开发效率。

相关文章:

JSON-RPC-CXX深度解析:C++中的远程调用利器

一、引言 1. JSON-RPC 简介及其在 C 开发中的重要性 JSON-RPC&#xff08;JavaScript Object Notation - Remote Procedure Call&#xff09;是一种基于 JSON 格式的远程过程调用协议。在 C 开发中&#xff0c;它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的…...

【后端速成Vue】模拟实现翻译功能

前言&#xff1a; 本期将会介绍 Vue 中的 watch 侦听器&#xff0c;它语法是怎么样的呢&#xff1f;具有怎样的功能呢&#xff1f;最后用模拟实现百度翻译来更进一步练习 watch 侦听器 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、认识翻…...

人脸识别技术:从算法到深度学习的全面解析

一、人脸识别技术综述 人脸识别技术作为一种重要的生物识别技术&#xff0c;在当今社会中具有举足轻重的地位。它广泛应用于各个领域&#xff0c;如金融领域的实名认证、安保领域的门禁系统、通行领域的火车站和地铁站检票、泛娱乐领域的美颜相机和短视频特效处理、公安和司法…...

WPF学习之路,控件的只读、是否可以、是否可见属性控制

C#的控件学习之控件属性操作 控件的只读、是否可以、是否可见&#xff0c;是三个重要的参数&#xff0c;在很多表单、列表中都有用到&#xff0c;正常表单控制可以在父层主键控制参数是否可以编辑和可见&#xff0c;但是遇到个别字段需要单独控制时&#xff0c;可以在初始化wi…...

植物神经紊乱不用怕,科学锻炼助你找回平衡✨

在这个快节奏、高压力的时代&#xff0c;你是否经常感到身心疲惫&#xff0c;情绪波动大&#xff0c;甚至偶尔还会出现心慌、失眠、消化不良等症状&#xff1f;这些可能都是植物神经功能紊乱在作祟&#xff01;&#x1f631;别担心&#xff0c;今天就来聊聊如何通过科学锻炼&am…...

shell 100例

1、每天写一个文件 (题目要求&#xff09; 请按照这样的日期格式(xxxx-xx-xx每日生成一个文件 例如生成的文件为2017-12-20.log&#xff0c;并且把磁盘的使用情况写到到这个文件中不用考虑cron&#xff0c;仅仅写脚本即可 [核心要点] date命令用法 df命令 知识补充&#xff1…...

CSS教程(二)- CSS选择器

1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器&#xff0c;根…...

Ubuntu20.04 解决一段时间后键盘卡死 输入延迟很大的问题 ubuntu

Ubuntu20.04 解决一段时间后键盘卡死 输入延迟很大的问题 为了确保您能顺利通过双击快捷方式来重启 IBus&#xff0c;下面详细描述了从脚本创建到快捷方式设置的每一步&#xff0c;包括具体的命令行操作和必要的说明&#xff0c;以确保您能够按步骤成功执行。 步骤 1: 创建并…...

http(s)接口设计注意事项

http(s)在设计时应考虑&#xff1a; 一、签名认证 鉴权&#xff0c;如jwt方式等。 二、重要参数加密 如&#xff1a;用户的登录密码、银行卡号、转账金额、用户身份证等。 三、IP白名单 为了进一步加强API接口的安全性&#xff0c;防止接口的签名或者加密被破解了&#x…...

Font Awesome Web 应用图标

Font Awesome Web 应用图标 引言 在当今的数字时代,图标在Web应用中扮演着至关重要的角色。它们不仅增强了用户界面的视觉吸引力,而且还提高了用户体验和互动性。Font Awesome是一个广受欢迎的图标库,它为开发人员提供了一系列高质量的图标,可以轻松地集成到Web应用中。本…...

bridge-vlan

# 1.topo # 2.创建命名空间 ip netns add ns0 ip netns add ns1 ip netns add ns2 ip netns add ns3 # 3.创建veth设备 ip link add ns0-veth0 type veth peer name hn0-veth0 ip link add ns1-veth0 type veth peer name hn1-veth0 ip link add ns2-veth0 type veth pe…...

【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件

MySQL与Oracle一样都是通过逻辑存储结构来管理物理存储结构&#xff0c;即管理硬盘上存储的各种文件。下面将详细介绍InnoDB存储引擎中的数据文件和重做日志文件。 一、数据文件 “.ibd”文件和ibdata文件 这两种文件都是存放Innodb数据的文件&#xff0c;之所以有两种文件来…...

华为云前台展示公网访问需要购买EIP,EIP流量走向

华为云前台网络&#xff08;VPC,安全组&#xff0c;EIP&#xff09; 1.EIP网段是从哪里划分的&#xff1f; 管理员在后台Service_OM已设置 Service_OM-网络资源-外部网络-创建外部网络基本信息&#xff1a;配置参数&#xff1a;*名称 public*网络类型 LOCAL 不带标签 类似开…...

排序算法 -插入排序

文章目录 1.插入排序&#xff08;Insertion Sort&#xff09;1.1 简介1.2 插入排序的步骤1.3 插入排序的C实现1.4 插入排序的时间复杂度1.5 插入排序的空间复杂度1.6 插入排序的动画 2. 二分插入排序&#xff08;Binary Insertion Sort&#xff09;2.1 简介2.2 二分插入排序步骤…...

如何使用.bat实现电脑自动重启?

1、在电脑桌面新建一个记事本文档&#xff0c;将如下内容写进去&#xff1a; echo off shutdown /r /t 02、然后&#xff0c;保存一下&#xff0c;再把桌面此文件重命名为电脑重启.bat 3、双击此程序&#xff0c;可以立刻重启电脑。 PS&#xff1a;① 此程序会不保存任何当前…...

使用VSCode远程连接服务器并解决Neo4j无法登陆问题

摘要&#xff1a;本文介绍了如何通过VSCode连接内网部署的Neo4j服务器&#xff0c;并启动服务。在访问Neo4j登录界面时&#xff0c;遇到了端口映射问题导致无法登录。通过手动添加7687端口的映射后&#xff0c;成功登录Neo4j。 我在内网部署了一台服务器&#xff0c;并在其上运…...

使用React和Vite构建一个AirBnb Experiences克隆网站

这一篇文章中&#xff0c;我会教你如何做一个AirBnb Experiences的克隆网站。主要涵盖React中Props的使用。 克隆网站最终呈现的效果&#xff1a; 1. 使用vite构建基础框架 npm create vitelatestcd airbnb-project npm install npm run dev2. 构建网站的3个部分 网站从上…...

HBase压测 ycsb

## ycsb 导入数据 rootXX.14.40.1971、对portrait压测 ansible hadoop -i hosts_hbase_portrait_20230730.txt -m shell -a "hostname && chdir/data/workspace/ycsb-0.17.0 nohup bin/ycsb load hbase20 -P workloads/workload_insert -cp /usr/local/fqlhadoop/…...

基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统

项目名称&#xff1a;基于PythonDjangoVue3MySQL实现的前后端分离商场车辆管理系统 技术栈 开发工具&#xff1a;PyCharm、Visual Studio Code (VSCode)运行环境&#xff1a;Python 3.10、MySQL 8.0、Node.js 18技术框架&#xff1a;Django 5、Vue 3.4、Ant-Design-Vue 4.12 …...

网络安全web基础_HTML基础(扫盲篇)

web基础_HTML扫盲篇 一、什么是 HTML&#xff1f; 二、HTML 的基本特点 三、HTML 基本结构概述 1.文档声明&#xff08;!DOCTYPE html&#xff09; 2. html元素 3. head元素 4. body 元素 四、HTML5的主要标签清单 文档结构标签 文本内容标签 链接和锚点标签 表格标…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...