初识RMI

 远程方法调用(Remote Method Invocation,RMI)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。

一个正常工作的RMI系统由下面几个部分组成:·

     .远程服务的接口定义

     ·远程服务接口的具体实现

     ·桩(Stub)和框架(Skeleton)文件

     ·一个运行远程服务的服务器

     ·一个RMI命名服务,它允许客户端去发现这个远程服务

     ·类文件的提供者(一个HTTP或者FTP服务器)

     ·一个需要这个远程服务的客户端程序

 

 

要完成以上步骤需要有以下几个步骤:

      1、生成一个远程接口 
      2、实现远程对象(服务器端程序) 
      3、生成占位程序和骨干网(服务器端程序) 
      4、编写服务器程序 
      5、编写客户程序 
      6、注册远程对象 
      7、启动远程对象

1. 创建远程接口及声明远程方法(TimerServiceInterface.java)

package com.weiythi.service;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ITimeService extends Remote{
	public long getTime() throws RemoteException;
}

 2. 实现远程接口及远程方法(继承UnicastRemoteObject)TimerService.java

package com.weiythi.service;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class TimerService extends UnicastRemoteObject implements ITimeService{
	private static final long serialVersionUID = 1L;
	/**  
	* 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常  
	*/  
	public TimerService() throws RemoteException{
		
	}
	/**
	 * 接口方法的实现
	 */
	@Override
	public long getTime() throws RemoteException {
		return System.currentTimeMillis();
	}
}
 

3. 启动RMI注册服务,并注册远程对象

 

   方法一,打开一个DOS窗口,使用rmic命令

          rmic com.weiythi.service.TimerService    

          启动RMI注册服务,指定端口为1099 (1099为默认端口)   

         start rmiregistry

         注册远程对象(HelloServer.java)

package com.weiythi.service;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class StartTimerServer {
	public static void main(String[] args){
		try {
			TimerService timerservice=new TimerService();
			//把TimerService注册到RMI注册服务器上,命名为b1   
			Naming.bind("b1", timerservice);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 方法二:package com.weiythi.service;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class StartTimerServer {
	public static void main(String[] args){
		try {
			//启动RMI注册服务
	        //也可以通过命令 start rmigesitry启动   
	        //这里用这种方式避免了再打开一个DOS窗口   
	        //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用   
	        LocateRegistry.createRegistry(1099);   
			TimerService timerservice=new TimerService();
			//把TimerService注册到RMI注册服务器上,命名为b1   
			Naming.bind("b1", timerservice);
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AlreadyBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 4. 客户端查找远程对象,并调用远程方法(GetTimerService.java)package com.weiythi.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import com.weiythi.service.ITimeService;

public class GetTimerService {
	public static void main(String[] args){
		try {
			ITimeService time=(ITimeService) Naming.lookup("rmi://localhost/b1");
			System.out.println("the time is:"+time.getTime());
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NotBoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
 
脑电时频分析I:谱分析 1、EEG频带划分 自发的EEG活动在活体大脑中持续存在,通常通过频率进行分类(也叫神经振荡活动) 特定频段的脑活动,即节律性的活动,具有特定的头皮分布和生物学意义 最后还有一个γ波,主要是指30hz~100hz的一个波段,通常这个波段也包含了噪声唁电的成分,比较难提取处理,比较少用到这个波段 这个波段主要是有可能躯体感觉皮层,进行一个多通道的感觉输入的i信号处理,比如我们同时处理视觉和听觉信号的处理,而且γ波与我们记忆的形成有关 除此之外,还有一个特殊的波段,8~12hz的Mu波段主要是特指我们 阅读详情

相关推荐

LSF调度实战:如何用bsub命令实现多队列资源抢占与公平调度

本文深入探讨了LSF作业调度系统的高级实战技巧,重点解析如何通过配置`lsb.queues`文件与灵活运用`bsub -R`命令,构建一套兼顾效率与公平的多队列资源抢占与调度体系。文章详细介绍了队列优先级设计、公平共享机制、资源感知调度以及抢占策略的实施,帮助集群管理员解决高优先级任务等待、资源分配不均等常见问题,实现计算资源的精细化管理和高效利用。

vvv99的博客 218

Study RMI《一、初识RMI》

RMI(Remote Method Invocation)即远程方法调用。在Java RMI中,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法,其中对象是通过序列化方式进行编码传输的。

傻大专栏 306

北航机器学习2020-2021秋季学期期末试题回忆

北航机器学习2020-2021秋季学习期末试题回忆 fanjn, zhangyy, yuanq, wanggq, weixy, anh, wangyy, zhouxy, likc1 【注:考试使用纯白的A3答题纸,考试时间2h,各位同学可以自行模拟考试】 此试卷1-8题为10分,第9题为20分 1.2077年人类发射近地卫星,一共发射800颗,根据大小和轨道远近,有着不同的宜居条件(+表示宜居),有以下表格(数字八九不离十,其他属性什么的原题就是交替的) 数量 大小 轨道 是否宜居 30

weixin_45262065的博客 7609

初识Java RMI框架

一、什么RMIRMI即(Rmote Method Invoke)远程方法调用。换句话说客户对象Client可以调用远程Server上的方法。客户端并不是直接调用远程服务上的方法,而是通过客户辅助对象与远程服务通信。客户辅助对象会联系服务器,传送相应的调用信息,等待服务器的返回。在服务器端,存在一个服务器辅助对象,该服务器辅助对象从客户端辅助对象中接收请求(通过Socket连接),将请求交由真正的服务

worm0527的博客 764

Linux 之 supervisor安装和使用

运行Supervisor的后台服务,它用来启动和管理那些你需要Supervisor管理的子进程,响应客户端发来的请求,重启意外退出的子进程,将子进程的stdout和stderr写入日志,响应事件等。它是Supervisor最核心的部分。

chang995196962的博客 5545

Mac上快速部署DeepSeek模型:Ollama终端操作全指南

本文详细介绍了在Mac上使用Ollama终端快速部署DeepSeek模型的完整指南。从硬件要求、Ollama安装、模型下载运行,到高级配置、可视化界面及常见问题解决,提供了全流程操作步骤与优化技巧,帮助开发者高效搭建本地AI助手,实现稳定、私密的离线使用体验。

weixin_29251567的博客 550

java rmi 开源_Java RMI那点事儿:初识HelloWorld

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件...

weixin_33206646的博客 161

为什么桥式传感器(Bridge Sensor)需要用到仪表放大器?

仪表放大器在桥式传感器的应用里起到关键作用,本文介绍桥式传感器的原理、特性,以及信号调理过程,并附上了一个 TINA - TI 的仿真电路。

疯狂的运放 1527

JavaSE--RMI初识

转自:http://blog.youkuaiyun.com/guyuealian/article/details/51992182 一、Java RMI机制:  远程方法调用RMI(Remote Method Invocation),是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同...

weixin_30600197的博客 231

如何通过Davinci Configurator来新增一个BswM仲裁规则

详细介绍如何通过Davinci Configurator来新增一个BswM仲裁规则。

initiallizer的博客 771

7、布尔网络的基础定义

本文介绍了布尔网络的基础定义及其在系统生物学中的应用。布尔网络是一种描述复杂系统动态行为的数学模型,由布尔变量和布尔函数组成,能够模拟生物系统中基因调控、信号传导和细胞代谢等过程。文章详细阐述了布尔网络的基本结构、动力学特征(如状态转移图和吸引子),以及其在生物建模中的重要价值,并探讨了优化和简化技术(如Backward Boolean Equivalence)如何提升其计算效率。

yhn45678901的博客 262

初识Java RMI远程调用

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。   Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。 大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些...

w84264423的专栏 150

基于粒子群优化的PID控制在药液流量控制系统中的应用

本文提出了一种基于粒子群优化(PSO)的PID控制算法,用于药液流量控制系统。系统采用C37控制器和Codesys 2.3编程环境实现,通过传感器实时监测流量、压力和车速,并控制水泵占空比和电动球阀开度来精确调节药液流量。硬件配置包括FT-2000流量传感器、PT-3000压力传感器和MV-500电动球阀等。控制算法将PSO与PID结合,使用ITAE指标优化PID参数,在Codesys中实现了包含PSO优化循环、PID控制等功能的程序模块。该系统通过分层控制策略和智能优化算法,提高了药液流量控制的精度和响应

AI的内部世界的博客 250

初识RMI基本原理

RMI分为客户端和服务器端,和socket类似。 客户端: package it.york.rmi.client; import it.york.rmi.stub.UserManagerInterface; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; pu

qq_32080243的博客 268

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

7. 初识 RMI 通信协议

 1.19                                 RMI  协议       基于RMI的一次完整的远程通信过程的原理:      1、客户端发起请求,请求转交至RMI客户端的stub类;    2、stub类将请求的接口、方法、参数等信息进行序列化;    3、基于socket将序列化后的流传输至服务器端;    4、服务器端接收到流后转发至相应的skelto...

java 空间 688

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

初识:rmi __完整的example

interface: package rmi; import java.rmi.Remote;import java.rmi.RemoteException; public interface PerfectTimeI extends Remote { public abstract String getHelloWorld(String name) throws RemoteExcept...

saybody 120

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

初识RPC中的RMI以及简单的代码实现

RPC和RMI RPC的全称为Remote Procedure Call,即远程过程调用。 RMI的全称为Remote Method Invocation,即原程方法调用。 RPC客户器和RPC服务器可以运行在不同的java虚拟机中。RPC客户端只需要引入一个接口,而这个接口的实现以及调用时所需要的数据都在RPC服务器中。在RPC服务器在客户端调用之前就将客户端可能用到的所有接口regist(注册...

weixin_43333714的博客 288

Java RMI那点事儿:初识HelloWorld

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34067102的博客 111

java rmi 安全_Java安全初探-RMI篇

Java RMI初识Java RMI 定义Java RMI(Java Remote Method Invocation),即Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。 Java RMI 使用 JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现,使得客户端运行的程序可以调用远程服务器上的对象。是实现RPC的...

weixin_39600885的博客 430

【菜鸟教程】Dubbo基础入门上——初识RPC框架

基础概念 Apache Dubbo是一款高性能、轻量级的Java RPC框架,前身是阿里的开源Java RPC框架,可以和spring无缝集成。 Dubbo提供了三大核心能力:面向接口的远程方法调用、智能容错和负载均衡、服务自动注册和发现。 RPC全称为remote procedure call,即远程过程调用。例如两台服务器A和B,A服务器部署一个应用,B服务器上部署一个应用,A服务器上的应用想...

qq_41112238的博客 1973

初识RPC

RPC:Remote Procedure Call Protocol(远程过程调用协议) 在分布式系统中,不同的应用或者服务部署在不同的服务器上,不同的服务器之间相互调用不在同一内存空间,也是不同进程之间的调用,为了解决此类问题,才有了RPC框架。那么RPC框架主要解决了哪些问题?往下看: 1、首先解决的是通讯的问题,客户端与服务端建立连接,可以是按需连接,也可以是长连接,建立连接后...

banfa3755的博客 115

【J2EE】——初识十三规范

在生活中无论使用什么物件都会有一套使用规范,而JavaEE就是基于java的技术的一系列标准规范,核心是一组技术规范与指南,包含各类组件,服务架构和技术层次,都共同的标准以及规范,使得Java架构在不同平台有非常好的兼容性。 1、JDBC(Java Data Base Conn...

chouxian0781的博客 179
上一篇: 初识RMI
下一篇: java生成随机密码的一个方法
weiythi
博客等级 码龄16年 23粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值