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.h
和jsonrpccxx/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
函数中,我们可以启动服务器并使其保持运行,以持续监听客户端的请求。
- 创建服务器实例和服务类实例
jsonrpccxx::HttpServerConnector serverConnector(8080);
MyService service(serverConnector);
- 调用StartListening启动服务器监听
service.StartListening();
std::cout << "Server started on port 8080." << std::endl;
当调用StartListening
函数后,服务器会进入监听状态,等待客户端的连接和请求。一旦有请求到达,服务器会根据请求的方法名和参数执行相应的方法,并将结果返回给客户端。
- 保持服务器运行
为了保持服务器运行,可以使用一个循环,例如while (true) {}
。这个循环只是一个简单的示例,在实际应用中,可能需要更好的服务器运行管理逻辑,比如使用信号处理来优雅地停止服务器。
- 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
方法并传递 3
和 4
作为参数。如果调用过程中出现 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
方法,传入两个参数 3
和 4
,然后输出结果。如果调用过程中出现 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(JavaScript Object Notation - Remote Procedure Call)是一种基于 JSON 格式的远程过程调用协议。在 C 开发中,它扮演着至关重要的角色。随着软件系统的日益复杂和分布式架构的…...
【后端速成Vue】模拟实现翻译功能
前言: 本期将会介绍 Vue 中的 watch 侦听器,它语法是怎么样的呢?具有怎样的功能呢?最后用模拟实现百度翻译来更进一步练习 watch 侦听器 篮球哥找工作专属IT岗位内部推荐: 专属内推链接:内推通道 1、认识翻…...
人脸识别技术:从算法到深度学习的全面解析
一、人脸识别技术综述 人脸识别技术作为一种重要的生物识别技术,在当今社会中具有举足轻重的地位。它广泛应用于各个领域,如金融领域的实名认证、安保领域的门禁系统、通行领域的火车站和地铁站检票、泛娱乐领域的美颜相机和短视频特效处理、公安和司法…...

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

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

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

CSS教程(二)- CSS选择器
1. 作用 匹配文档中的某些元素为其应用样式。根据不同需求把不同的标签选出来。 2. 分类 分类 基础选择器 包含 标签选择器、ID选择器、类选择器、通用选择器等 复合选择器 包含 后代选择器、子代选择器、伪类选择器等 1 标签选择器 介绍 又称为元素选择器,根…...
Ubuntu20.04 解决一段时间后键盘卡死 输入延迟很大的问题 ubuntu
Ubuntu20.04 解决一段时间后键盘卡死 输入延迟很大的问题 为了确保您能顺利通过双击快捷方式来重启 IBus,下面详细描述了从脚本创建到快捷方式设置的每一步,包括具体的命令行操作和必要的说明,以确保您能够按步骤成功执行。 步骤 1: 创建并…...
http(s)接口设计注意事项
http(s)在设计时应考虑: 一、签名认证 鉴权,如jwt方式等。 二、重要参数加密 如:用户的登录密码、银行卡号、转账金额、用户身份证等。 三、IP白名单 为了进一步加强API接口的安全性,防止接口的签名或者加密被破解了&#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一样都是通过逻辑存储结构来管理物理存储结构,即管理硬盘上存储的各种文件。下面将详细介绍InnoDB存储引擎中的数据文件和重做日志文件。 一、数据文件 “.ibd”文件和ibdata文件 这两种文件都是存放Innodb数据的文件,之所以有两种文件来…...

华为云前台展示公网访问需要购买EIP,EIP流量走向
华为云前台网络(VPC,安全组,EIP) 1.EIP网段是从哪里划分的? 管理员在后台Service_OM已设置 Service_OM-网络资源-外部网络-创建外部网络基本信息:配置参数:*名称 public*网络类型 LOCAL 不带标签 类似开…...

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

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

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

使用React和Vite构建一个AirBnb Experiences克隆网站
这一篇文章中,我会教你如何做一个AirBnb Experiences的克隆网站。主要涵盖React中Props的使用。 克隆网站最终呈现的效果: 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实现的前后端分类的商场车辆管理系统
项目名称:基于PythonDjangoVue3MySQL实现的前后端分离商场车辆管理系统 技术栈 开发工具:PyCharm、Visual Studio Code (VSCode)运行环境:Python 3.10、MySQL 8.0、Node.js 18技术框架:Django 5、Vue 3.4、Ant-Design-Vue 4.12 …...

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

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)
当我们网关配置好了,DNS也配置好了,最后在虚拟机里还是无法访问百度的网址。 第一种情况: 我们先考虑一下,网关的IP是否和虚拟机编辑器里的IP一样不,如果不一样需要更改一下,因为我们访问百度需要从物理机…...

SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
【导读】 本文针对无人机(UAV)视频中目标尺寸小、运动快导致的多目标跟踪难题,提出一种更简单高效的方法。核心创新在于从低置信度检测启动跟踪(贴合无人机场景特性),并改进传统外观匹配算法以关联此类检测…...