RMI规范--八

Java远程方法调用(RMI)技术详解 Java RMI(远程方法调用)采用三层架构实现分布式通信,包含注册表服务、服务端和客户端三大核心组件。服务端通过导出远程对象并绑定到注册表,客户端通过接口契约查找并调用远程方法。RMI采用租约机制管理远程对象生命周期,通过引用计数和定期续租实现分布式垃圾回收。开发时需要严格分离服务端与客户端代码,通过模块化部署确保安全性,并注意注册表必须与服务器同机部署。RMI架构隐藏了底层网络通信细节,使远程调用语法与本地调用保持一致,同时处理了对象定位、参数序列化和异常处理等分布式环境下的复杂问题。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 第 8 章 本章包含 rmic stub 编译器生成的 stub 和 skleton 所用的接口和类。 主题: RemoteStub 类 RemoteCall 接口 RemoteRef 接口 ServerRef 接口 Skeleton 接口 Operation 类 8.1 RemoteStub 类 java.rmi.server.RemoteStub 类是远程对象 stub 的通用超类。stub 对象是一 种代理,它支持的远程接口集与远程对象的实际实现所定义的完全相同。


package java.rmi.server; 

public abstract class RemoteStub extends java.rmi.RemoteObject 

{ 

protected RemoteStub(); 

protected RemoteStub(RemoteRef ref); 

protected static void setRef(RemoteStub stub, RemoteRef ref); 

} 



RemoteStub 的第一个构造函数将创建带有空远程引用的 stub。第二个构造函数 将创建带有给定远程引用 ref 的 stub。 JDK1.2 中不鼓励使用(且不支持)setRef 方法。 8.1.1 远程对象与 stub 类的类型等价性 客户机可与 stub(代理)对象进行交互,该 stub 的远程接口集与远程对象类所 定义的完全相同。由于 stub 类是由实现一个或多个远程接口的实现类精华所生 成的,因此 stub 类不包括类层次(组成对象的类型图)的非远程部分。例如, 如果 C 扩展 B 而 B 扩展 A,但只有 B 实现远程接口,则 stub 将由 B 生成, 而非 C。 由于 stub 实现与远程对象类相同的远程接口集,因此从 Java 系统的角度看, stub 拥有与服务器对象类型图的远程部分相同的类型。这样,客户机即可利用内 置 Java 操作来检查远程对象的类型,同时也可从一个远程接口向另一远程接口 进行强制类型转换。 stub 是用 rmic 编译器生成的。 8.1.2 声明为终态的对象方法的语义 以下方法在 java.lang.Object 类中被声明为终态 final,因此不能被任意实现 所覆盖: getClass notify notifyAll wait getClass 的缺省实现适用于所有 Java 对象(本地或远程);对于远程对象,该 方法不需要专门的实现。getClass 方法在远程 stub 上使用时,它报告由 rmic 生成的 stub 对象的确切类型。注意,stub 类型仅反映远程对象实现的远程接 口,而非本地接口。 java.lang.Object 的 wait 和 notify 方法将处理 Java 语言线程模型上下文中 的等待和通知。虽然对远程 stub 使用这些方法不会违反 Java 线程模型,但这 些方法的语义将与用于本地 Java 对象时的语义不同。尤其,使用这些方法时所 操作的将是远程对象的客户机本地引用 (stub),而不是远程站点的实际对象。 8.2 RemoteCall 接口 RemoteCall 是远程对象的 stub 和 skeleton 所用的抽象接口,用来执行对远程 对象的调用。 ---------------------------------------------------------------------- ---------- 注意 - JDK 1.2 中不鼓励使用 RemoteCall 接口。JDK 1.2 stub 协议也已不再 使用此接口。现在,stub 在 JDK 1.2 中使用新的 invoke 方法,该方法不需要 将 RemoteCall 作为参数。
package java.rmi.server; 

import java.io.*; 



public interface RemoteCall 

{ 

ObjectOutput getOutputStream() throws IOException; 

void releaseOutputStream() throws IOException; 

ObjectInput getInputStream() throws IOException; 

void releaseInputStream() throws IOException; 

ObjectOutput getResultStream(boolean success) 

throws IOException, StreamCorruptedException; 

void executeCall() throws Exception; 

void done() throws IOException; 

} 

方法 getOutputStream 返回输出流。stub 将把参数编组到其中,或者 skeleton 将把结果编组到其中。 方法 releaseOutputStream 释放输出流。在某些传输中,这将导致释放流。 方法 getInputStream 返回 InputStream。stub 从中解编结果,或者 skeleton 从中解编参数。 方法 releaseInputStream 释放输入流。这将允许某些传输提前释放连接的输入 端。 方法 getResultStream 返回输出流(写完与调用成功有关的标题信息后)。每次 远程调用将只能获得一次结果流。如果 success 为真,则要编组的结果属于正常 返回;否则结果为异常。如果已获得该远程调用的结果流,则抛出 StreamCorruptedException。 方法 executeCall 尽其所能执行调用。 方法 done 允许完成远程调用后进行清除。 .3 RemoteRef 接口 接口 RemoteRef 表示远程对象的句柄。每个 stub 均包含 RemoteRef 的一个实 例,其中包含引用的具体表示。该远程引用将用来在其代表的远程对象上执行远 程调用。


package java.rmi.server; 



public interface RemoteRef extends java.io.Externalizable 

{ 

Object invoke(Remote obj, 

java.lang.reflect.Method method, 

Object[] params, 

long opnum) 

throws Exception; 



RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum, long hash) 

throws RemoteException; 

void invoke(RemoteCall call) throws Exception; 

void done(RemoteCall call) throws RemoteException; 

String getRefClass(java.io.ObjectOutput out); 

int remoteHashCode(); 

boolean remoteEquals(RemoteRef obj); 

String remoteToString(); 

} 

第一个 invoke 方法将方法调用代理给 stub (obj) 的远程引用,并允许引用负 责建立对远程主机的连接,将 method 和参数 params 的一些表示进行编组,然 后使用方法调用与远程主机进行通讯。该方法将返回驻留在远程主机上的远程对 象的方法调用结果,或者在调用失败时抛出 RemoteException,而在远程调用抛 出异常时则抛出应用程序级异常。注意,操作号 opnum 表示一散列方法签名,可 以用来对要传输的方法进行编码。 opnum 的方法散列是一个 64 位(长)整数,是根据美国国家标准技术局 (NIST ) 的安全散列算法 (SHA-1),用字节流消息摘要的前两个 32 位值计算而来的。 字节流包含由远程方法名后跟其方法描述符组成的字符串的 UTF 编码(有关方法 描述符的说明,参见 Java 虚拟机规范的第 4.3.3 节)。散列值将从 SHA-1 散 列的第一个和第二个 32 位值得到。 long hash = sha[1] << 32 sha[0] ---------------------------------------------------------------------- ---------- 注意 - JDK 1.2 中不鼓励使用 newCall、invoke 和 done 方法。rmic 用 JDK 1.2 stub 协议版本生成的 stub 不再使用这些方法。由 newCall、invoke 和 d one 组成的调用序列已被新的 invoke 方法所替换,该新方法将 Method 对象作 为一个参数。 ---------------------------------------------------------------------- ---------- 方法 newCall 将为远程对象 obj 上的新远程方法调用创建相应的调用对象。操 作数组 op 包含远程对象上的可用操作。操作号 opnum 是对操作数组的索引,它 指定该远程调用的特定操作。 传递操作数组和索引可使 stub 生成器能分派操作 索引并进行解释。远程引用可能需要操作说明以在调用中进行编码。 方法 invoke 负责执行远程调用。invoke 将产生能顺利通过而不被 stub 捕获的 “用户”异常。如果在远程调用过程中产生异常,则 invoke 应注意在产生“用 户异常”或 RemoteException 之前清除连接。 方法 done 允许远程引用清除(或重新使用)连接。只有当 invoke 调用已成功 地(非异常)返回 stub 时,才应调用 done。 方法 getRefClass 返回将被序列化到流 out 上的引用类型的非包限定的类全名 。 方法 remoteHashCode 返回远程对象的散列码。两个引用相同远程对象的远程对 象 stub 将有相同的散列码(以支持在散列表中将远程对象作为键值)。Remote Object 将把对其 hashCode 方法的调用转发给远程引用的 remoteHashCode 方法 。 方法 remoteEquals 比较两个远程对象的等价性。如果两个远程对象引用相同的 远程对象,即认为它们等价。例如,如果两个 stub 引用相同的远程对象,则认 为它们等价。 RemoteObject 将把对其 equals 方法的调用转发给远程引用的 r emoteEquals 方法。 方法 remoteToString 返回表示该远程对象的引用的 String。 8.4 ServerRef 接口 接口 ServerRef 表示远程对象实现的服务器端句柄。


package java.rmi.server; 



public interface ServerRef extends RemoteRef { 



RemoteStub exportObject(java.rmi.Remote obj, Object data) 

throws java.rmi.RemoteException; 



String getClientHost() throws ServerNotActiveException; 

} 

方法 exportObject 将为所提供的 Remote 对象实现 obj 查找或创建客户机 st ub 对象。参数 data 包含导出对象所需的信息(如端口号)。 方法 getClientHost 返回当前客户机的主机名。当它被当前正在处理远程对象调 用的线程调用时,将返回执行此调用的客户机主机名。如果当前某一远程方法调 用未处于服务状态,则调用 ServerNotActiveException。 8.5 Skeleton 接口 接口 Skeleton 仅能由 rmic 编译器所生成 skeleton 的实现。远程对象的 ske leton 是服务器端的实体,它将为实际远程对象实现分配调用。 ---------------------------------------------------------------------- ---------- 注意 - JDK1.2 中不鼓励使用 Skeleton 接口。每个由 rmic stub 编译器生成的 1.1(以及在 1.2 中由缺省 rmic -vcompat 生成的兼容 1.1 的 skeleton)sk eleton 类均实现该接口。JDK1.2 兼容版本中分配远程方法调用将不再需要 ske leton。要生成兼容 JDK1.2 或更高版本的 stub,请使用带有选项 -v1.2 的命令 rmic。 ---------------------------------------------------------------------- ----------


package java.rmi.server; 



public interface Skeleton 

{ 



void dispatch(Remote obj, RemoteCall call, int opnum, long hash) 

throws Exception; 

Operation[] getOperations(); 

} 
dispatch 方法将解编 call 对象中获得的输入流中的参数,调用实际远程对象实 现 obj 上的方法(由操作号 opnum 表示),然后将返回值进行编组。如果在调 用过程中发生异常,则抛出异常。 getOperations 方法返回包含远程对象方法的操作描述符的数组。 8.6 Operation 类 类 Operation 包含对远程对象 Java 方法的说明。 ---------------------------------------------------------------------- ---------- 注意 - JDK 1.2 中不鼓励使用 Operation 接口。JDK 1.2 stub 协议不再使用原 有的、以 Operation 作为参数的 RemoteRef.invoke 方法。stub 在 JDK 1.2 中 使用了新的 invoke 方法,它不再需要将 Operation 作为参数。 ---------------------------------------------------------------------- ----------


package java.rmi.server; 



public class Operation 

{ 



public Operation(String op); 



public String getOperation(); 



public String toString(); 

} 

构造 Operation 对象时通常带有方法签名。 方法 getOperation 返回操作描述符的内容(其初始化时使用的值)。 方法 toString 也返回操作描述符的字符串表示(通常为方法签名)。 RMI规范--二 RMI规范--三 RMI规范--四 RMI规范--五 RMI规范--六 RMI规范--七 RMI规范--八 RMI规范--九
RMI规范 RMI详细介绍 RMI 规范 RMI 详细介绍 共10章 立即下载

相关推荐

RMI规范说明

RMI规范说明,1。2版本

JAVA RMI线程模型及内部实现机制

JAVA RMI线程模型

sureyonder的专栏 1万+

手把手教学:用国产GLM-4.6替代Claude4.0,实现AI自动化编程全流程

本文提供了一份详细的教程,指导开发者使用国产GLM-4.6模型替代Claude 4.0,实现AI自动化编程。内容涵盖从获取API密钥、搭建本地环境、改造Claude Code工具到实战开发与VSCode集成的全流程,旨在帮助用户低成本、高效率地体验AI自主编程。

weixin_29070861的博客 555

RMI 规范

RMI(基本概念) Java Remote Method Invocation ( RMI -- Java 远程方法调用)允许您使用Java 编写分布式对象,不同的Java 虚拟机(JVM)之间进行对象间的通讯。这些JVM 可以在一台者多台计算机上,使得应用程序(Application) 可以远程调用方法,共享各个系统的资源和处理能力。  RMI 的主要优点 面向对象: RMI 可将完整的

忧郁王子的专栏 2667

MATLAB锂离子电池伪二维(P2D)模型实现

锂离子电池伪二维(P2D)模型的MATLAB实现。该模型基于Newman等人提出的经典电化学模型,考虑了固液相扩散、电荷守恒和电化学反应动力学。

hie98894的博客 1932

uniapp串口通信实战:从零搭建物联网设备控制App(附完整代码)

本文详细介绍了如何使用Uniapp实现串口通信,从零搭建物联网设备控制App。内容涵盖环境配置、串口初始化、数据收发、错误处理等核心功能,并提供了完整的代码示例,帮助开发者快速掌握跨平台串口通信技术,适用于智能农业、工业自动化等物联网场景。

weixin_30369041的博客 597

RMI规范–第十章 RMI 通信协议

RMI规范–第十章 RMI 通信协议 (转贴) 10.1 概述RMI 协议使用另两个协议作为其在通信格式:Java 对象序列化和 HTTP。对象序列化协议用于编组调用和返回数据。HTTP 协议用于“投寄”远程方法调用,并在情况允许时获得返回数据。 每种协议都有专门的语法文档。产品规则中的非终结符号可能会引用其它协议(对象序列化或 HTTP)所管理的规则。在跨协议边界时,后续产品将使用该...

jybzjf的专栏 1434

逆向Shopee签名机制:从参数分析到稳定采集方案

本文深入解析了Shopee签名机制的逆向过程,从参数分析到稳定采集方案的实现。通过抓包定位关键参数`sap-ri`和`x-sap-sec`,还原了签名生成算法,并提供了Python实现代码。文章还分享了反反爬策略、性能优化技巧及长期维护建议,帮助开发者构建稳定的Shopee数据采集方案。

weixin_27722377的博客 678

java RMI原理详解

定义 RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。 Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里

xinghun_4的专栏 3万+

在ROS中使用行为树

在ROS中使用行为树 我提供的工程示例文件: demo链接 文章目录在ROS中使用行为树0、 学习本教程的前提1、 behaviorTree 库安装(ROS使用下的安装方式)2、 处理 behaviortree 库并准备好 service 和 ros action2.1 对ROS 的 service 和 action 进行封装,使其在 behaviortree 上使用更加方便。2.2 创建一个 service 和一个 action2.3 创建与决策树相关的数据类型2.4 修改`package.xml`文件2

qq_37416258的博客 6380

在线考试系统源码+数据库+word+ppt(高分毕业设计)

本系统通过Spring Cloud实现微服务拆分,将授权、考试、监控等功能解耦,既保证了系统的扩展性,也便于后期维护。基于OAuth2.0的单点登录,解决多服务统一认证问题;考试与练习模式分离,满足不同场景需求;集成Druid与Hystrix,保障系统监控与稳定性。

weixin_44355158的博客 738

RMI规范(4)

RMI规范--第四章 客户机接口 程序员在编写使用远程对象的 applet 或应用程序时,需要注意 java.rmi 包 中可用的 RMI 系统客户机可视接口。 4.1 远程接口 package java.rmi; public interface Remote {} java.rmi.Remote 接口用来识别所有远程接口;所有远程对象必须直接或间接 实现此接口。 实现类可以

morningbird的专栏 1257

BUG调试案例一:RK3588+YT8531网络无法PING通调试案例

在使用 RK3588 搭配 YT8531S PHY 芯片进行网络调试时,遇到了“网络无法 Ping 通”的棘手问题。排查了两天,终于找到问题原因。为了避免大家在类似项目中走弯路,也为了加深自己对调试细节的理解,我们特意整理了本次问题的完整排查过程。本篇文章将围绕以下四个方面展开分享: 问题现象&描述 调试过程&分析 问题根源定位 注意事项提醒 举一反三(走两步)

案例文章,高速信号 2336

RMI规范(6) --(10)

RMI规范(6) 注册服务程序接口 ------------------------------------------------------------------------------- ------------------------------------------------------------------------------- 第 6 章 RMI 系统使用 java.

bluevoyage的专栏 1万+

【异常】Milvus向量数据库的常见错误“collection not loaded“(集合未加载)

Milvus数据库报错"collection not loaded"分析及解决方案。该错误发生在对未加载的集合执行查询操作时,核心原因是集合创建后需先加载到内存才能使用。解决方案包括:1)确认集合是否存在;2)查询前调用loadCollection接口加载集合;3)处理加载超时或失败情况,可检查加载状态;4)确保Milvus服务正常运行。建议在长期不使用集合时释放内存资源。文末附Java代码示例说明具体操作方法。

奶爸的编程之路,也就一周冷个三天 381

贝叶斯统计 [韦来生编]

贝叶斯(Bayes)统计是近几十年来迅速发展起来的数理统计的一个重要分支。贝叶斯方法与经典统计方法的主要不同之处是进行统计推断时除了利用样本信息外,还要利用参数的先验信息,因此可以提高统计推断或统计决策的效果。它在经济、金融、生物、医学、自然科学和社会科学等许多领域具有广泛的应用。贝叶斯方法的研究已渗透到了统计学的几乎所有领域。作者在给中国科学技术大学概率论与数理统计专业本科生开设的“数理统计”课程中有一章专门讲授“贝叶斯方法和统计决策理论”,近十年来也给中国科学技术大学概率统计专业研究生开设过几次“贝叶斯分析”课。本书是在对过去讲稿的内容作了适当的增减和调整的基础上完成的。  本书共分六章。第1章是绪论,介绍了贝叶斯统计的若干基本概念,同时对必要的数理统计的基础知识有重点地作了回顾。第二章介绍了确定先验分布的若干可供选择的方法。第三章介绍了几类常见统计模型参数的后验分布的主要结果和计算方法。第四章和第五章分别介绍了“贝叶斯统计推断”和“贝叶斯统计决策”的内容。第六章介绍了贝叶斯统计计算的若干方法,包括蒙特卡洛方法和马尔可夫链蒙特卡洛(MCMC)方法以及相关统计软件的简介。本书的每一章附右大量的例题和习题,书末附有常用的几个表格和部分习题解答供读者查用。  大约可在54学时内讲授本书的第1章至第六章的主要内容,教师可根据学时需要选讲本书第1章至第六章的部分内容。书中标“*”号的章节可略去不讲,留给读者作为阅读材料。第六章例题中的R代码和部分例题的数据文件等可从作者个人主页下载。  作者在编写本书的过程中参考了J.O.Berger教授的《统计决策论及贝叶斯分析》和茆诗松教授编写的《贝叶斯统计》等书中的一些内容,以及《贝叶斯分析》一书中由张伟平博士编写的有关贝叶斯统计计算的一些内容。在此表示衷心感谢。  本书编写准备过程中,中国科学技术大学统计与金融系的几个研究生帮助完成了本书部分中文的录入和排版,作者对他们的辛勤工作表示真诚的感谢。高等教育出版社为本书的出版给予了大力支持。在此一并致谢。

RMI规范(3)

RMI规范--第三章 主题: Stub 与 skeleton 远程方法调用中的线程使用 远程对象的垃圾收集 动态类的加载 通过代理服务器透过防火墙的 RMI 3.1 Stub 与 skeleton 在与远程对象的通信过程中,RMI 将使用标准机制(用于 RPC 系统):stub 与 skeleton。远程对象的 stub 担当远程对象的客户本地代表或代理人角色。 调用程序将调用本地 s

morningbird的专栏 1183

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RMI规范(2)

RMI规范--第二章 Java 分布式对象模型 2.1 分布式对象应用程序 RMI 应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务 器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机 调用那些远程对象上的方法。而典型的客户机程序则从服务器中得到一个或多个 远程对象的引用,然后调用远程对象的方法。RMI 为服务器和客户机进行通讯 和信息传递提供了一种机

morningbird的专栏 1989

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

RMI规范(5)

RMI规范--第五章 服务器接口 java.rmi.server 包包含通常用于实现远程对象的接口与类。 主题: RemoteObject 类 RemoteServer 类 UnicastRemoteObject 类 Unreferenced 接口 RMISecurityManager 类 RMIClassLoader 类 LoaderHandler 接口 RMI 套接字工厂 RMIFai

morningbird的专栏 1167

RMI介绍

      其实我近日有想法要请总坛主开设Java分布式应用版块,专门讨论Java分布式应用。如Jini,CORBA,RMI,RMI-IIOP等。更进一步,还包括各种技术之间的通讯等问题。比如RMI-IIOP和CORBA通讯,Jini访问CORBA对象,EJB到CORBA映射等高级问题。不过暂时还没有实现。所以姑且在此先讨论一下这些东西好了。RMI是Sun基于Java技术推出的一种分布式应用方案。

天高任鸟飞,海阔凭鱼跃 2751

RMI规范--第二 -- 五章

?RMI规范--第二章 Java 分布式对象模型 。。RMI规范--第三章 主题: Stub 与 skeleton;; 远程方法调用中的线程使用 ;;远程对象的垃圾收集;;动态类的加载;;通过代理服务器透过防火墙的 RMI ;;。。RMI规范--第四章 客户机接口;; 程序员在编写使用远程对象的 applet 或应用程序时,需要注意 java.rmi 包中可用的 RMI 系统客户机可视

bluevoyage的专栏 1694

RMI规范(10)

RMI 通信协议 10.1 概述 RMI 协议使用另两个协议作为其在通信格式:Java 对象序列化和 HTTP。对象序 列化协议用于编组调用和返回数据。HTTP 协议用于“投寄”远程方法调用,并在 情况允许时获得返回数据。每种协议都有专门的语法文档。产品规则中的非终结 符号可能会引用其它协议(对象序列化或 HTTP)所管理的规则。在跨协议边界时 ,后续产品将使用该嵌入的协议。 关于语法符号

morningbird的专栏 1024

【Dongle】【Java】规范之RMI

RMI(Remote Method Invoke):remote(遥远的) invoke(调用),RMI是一种被EJB使用的更底层的协议,能够让在某个Java虚拟机上的对象像调用本地对象一样调用另一个java 虚拟机中的对象上的方法。

郑晓东 廊坊师范学院信息技术提高班 十二期 657

RMI规范--五

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 442

RMI规范--四

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 262

RMI规范

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 443
上一篇: RMI规范--七
下一篇: RMI规范--五
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值