RPC远程过程调用之 RMI实现

RMI(Remote Method Invocation)协议 RMI(Remote Method Invocation,远程方法调用)是一种用于在分布式系统中实现对象之间通信的协议。它允许一个Java对象(客户端)调用另一个Java对象(服务器端)的方法,即使这两个对象运行在不同的虚拟机(JVM)中,甚至不同的物理机器上。RMI是Java语言中内置的分布式计算技术,主要用于构建分布式应用程序。 阅读详情

1)RMI(remote method invocation)是java原生支持的远程调用,RMI采用JRMP(java RemoteMessageing Protocol)作为通信协议。可以认为是纯java版本的分布式远程调用解决方法。

2)RMI的核心概念

3)RMI实现步骤

1、创建远程接口,并继承java.rmi.Remote接口

2、实现远程接口,并继承:UnicastRemoteObject

3、创建服务器程序,createRegistry() 方法注册远程对象

4、创建客户端程序,(获取注册信息,调用接口方法)

RMI_SERVER
 

package com.itheima.service;

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

public interface UserService extends Remote  {
    String sayHello(String name) throws RemoteException;
}

package com.itheima.service.impl;

import com.itheima.service.UserService;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class UserServiceImpl extends UnicastRemoteObject implements UserService {
    public UserServiceImpl() throws RemoteException {

    }

    @Override
    public String sayHello(String name) throws RemoteException {
        return name + "调用了服务端的sayHello方法";
    }
}
package com.itheima.server;

import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;

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

public class ServerMain {
    public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
        //启动RMI注册服务,指定端口号
        LocateRegistry.createRegistry(8888);
        //创建要被访问的远程对象的实例
        UserService userService = new UserServiceImpl();
        //将远程对象实例注册到RMI注册服务器上
        Naming.bind("rmi://127.0.0.1:8888/UserServer", userService);
        System.out.println("服务端启动中………………");
    }
}

RMI_CLIENT

package com.itheima.service;

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

public interface UserService extends Remote  {
    String sayHello(String name) throws RemoteException;
}

package com.itheima.client;

import com.itheima.service.UserService;

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

public class ClientMain {
    public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
        UserService userService = (UserService) Naming.lookup("rmi://127.0.0.1:8888/UserServer");
        String s = userService.sayHello("客户端");
        System.out.println(s);


    }
}

注意:

client中Naming.lookup需要强转成UserService  此时的package路径要与server中的Userserver中的路径一致:

否则出现报错:

"C:\Program Files\Java\jdk1.8.0_131\bin\java.exe" "-javaagent:D:\ruanjian\ideaiu14\ideaiu14\idea\IntelliJ IDEA 2020.1\lib\idea_rt.jar=63728:D:\ruanjian\ideaiu14\ideaiu14\idea\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_131\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_131\jre\lib\rt.jar;F:\RPC\RMI\rmi_client\target\classes" com.itheima.client.ClientMain
Exception in thread "main" java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
	java.lang.ClassNotFoundException: com.itheima.service.UserService (no security manager: RMI class loader disabled)
	at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
	at java.rmi.Naming.lookup(Naming.java:101)
	at com.itheima.client.ClientMain.main(ClientMain.java:12)
Caused by: java.lang.ClassNotFoundException: com.itheima.service.UserService (no security manager: RMI class loader disabled)
	at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:556)
	at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
	at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
	at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:265)
	at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1758)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1710)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2000)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
	... 3 more

Process finished with exit code 1

运行结果:

需要先启动服端:
服务端启动中………………
客户端结果:

客户端调用了服务端的sayHello方法

 说明:在两个项目中,客户端成功的调用了服务器的sayHello()方法

远程方法调用(RMI)与远程过程调用(RPC) 一、RMI 远程方法调用 RMI(Remote Method Invocation)远程方法调用。能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的对象上的方法。使用代表:EJB RMI远方法程调用步骤: 1、客户调用客户端辅助对象stub上的方法 2、客户端辅助对象stub打包调用信息(变量、方法名),通过网络发送给服务端辅助对象skeleton 3、服... 阅读详情

相关推荐

外贸英文函电第三版张梅英课后习题答案解析

我参加了一些外贸模拟竞赛,将所学知识运用到实际工作中,取得了不错的成绩。此外,我还积极参与了一些外贸实践活动,如参加实习、担任志愿者等,从中积累更多的经验。在这个过程中,我逐渐摸索出了一套适合自己的学习方法,不仅提高了学习效果,还增强了自信心。通过学习这本书,我们可以提高自己在外贸领域的沟通能力,更好地应对未来的工作挑战。在学习这本书的过程中,我遇到了一些困难,比如对某些专业术语的理解不够透彻,对信件的结构和格式掌握不够熟练。出版社: 高等教育出版社。上传者: ʚ河西撒手没ɞ。

weixin_58833001的博客 1427

Eureka注册中心实现远程调用

Eureka注册中心实现远程调用

weixin_52472963的博客 278

线性代数——(期末突击)行列式(上)-行列式计算、行列式的性质

简单解释一下:4213原本的顺序应为1234,对于‘4’而言,‘2’、‘1’、‘3’都应该排在它的前面,所以此处记逆序数为3;对于‘2’而言,‘1’应该排在它的前面,而‘3’排在它之后 是合理的,所以此处只有一个逆序数;最后看‘1’,其后面的‘3’排在后面显然也是合理的,故而4213的逆序数为4.一般我们使用这个性质来计算四阶行列式,也就是将其变换成三角行列式,再计算对角线的值;以主对角线为分界线的就为正三角,反之则为反三角行列式。若行列式某一行(列)为0,则该行列式=0.将和的那一行分开,其余行。

li13437542099的博客 1万+

远程通信协议RMI原理

1、前言 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS 等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地...

长沙老码农 8387

YOLOv8n模型导出ONNX的避坑指南:解决版本差异,正确生成TensorRT/RKNN所需输出节点

本文详细介绍了YOLOv8n模型导出ONNX格式的实战避坑指南,涵盖版本差异处理、代码修改技巧及TensorRT/RKNN部署优化方案。针对不同推理框架需求,提供输出节点生成、动态轴处理和后处理划分等核心问题的解决方案,帮助开发者高效完成模型部署。

weixin_33247358的博客 357

手把手教你复现KDD 2024时空预测顶会论文:以UniST和ImputeFormer为例的代码实战与避坑指南

本文详细指导如何复现KDD 2024顶会论文中的UniST和ImputeFormer模型,涵盖环境配置、数据处理、模型训练及评估等关键步骤。通过实战案例和避坑指南,帮助研究者掌握时空预测与插补技术,提升在智慧城市、交通管理等领域的应用能力。

weixin_29204205的博客 279

RMI协议详解

RMI(Remote Method Invocation,远程方法调用)是Java中的一种远程通信协议,用于实现跨网络的对象方法调用。RMI协议基于Java的分布式计算,可以让客户端程序调用远程服务器上的方法,使得分布在不同机器上的对象能够通过网络进行通信。RMI协议的实现基于Java的远程对象技术,其中远程对象需要继承java.rmi.UnicastRemoteObject类,并定义远程方法。

技术人集结地 3472

使用Avalonia跨Linux平台

Avalonia类似使用WPF的技术方法来开发,所以,需要会使用WPF,其中的一些语法和写法与WPF有所区别,但是他们相差不大,会WPF的话,基本上可以看看文档后,完全掌握Avalonia的使用,从而达到跨平台开发的任务。其实写法有些不一样,可以参考官网的说明,进行修改。2. 安装完成后,重启VS2022,我们可以看到1和2,其中1是使用MVVM模式开发,2是普通模式开发,我们选择2,建立项目。9.直接双击粉红色的文件,进行安装,输入密码,但是美中不足的是,好像没有图标,图标似乎需要单独去设置。

故里2130 1万+

java的RMI协议

java的RMI协议

wanan的博客 396

Comsol单层焊缝焊接数值模拟:温度场与应力场全流程解析

在工程制造领域,有限元模拟是研究焊接热-力行为、优化工艺参数的重要工具。焊接过程涉及强烈的局部加热和快速冷却,材料经历复杂的非线性和相变,必须通过瞬态分析和热-力顺序耦合,才能准确捕捉移动热源作用下的温度演化与应力塑性积累。这一技术广泛应用于压力容器、船舶结构、车辆制造等场景,用以预测残余应力与变形、评估冷裂纹风险,并为工艺设计提供定量支撑。焊接数值模拟能否真正指导实践,关键在于热源校核、随温度变化的材料参数、合理的边界条件与网格策略。单层焊缝作为焊接模拟的基础模型,涵盖了移动热源加载、熔池形成、高温软化与

weixin_30444111的博客 225

芯片ATE测试PAT(Part Average Testing)学习总结-20250916

文章摘要:零件平均测试(PAT)是半导体制造中基于统计学的质量控制方法,分为静态和动态两种类型。静态PAT通过预先设定的固定限值(每6-8批次更新)筛选异常芯片,计算采用稳健平均值和四分位间距。动态PAT则根据实时数据调整限值,能更精确识别异常而不误判合格芯片。两种方法均采用"均值±6倍标准差"的计算公式,但动态PAT具有更好的适应性和准确性。该方法通过统计分析提高了芯片产品的质量和可靠性。

歌颂苦难的行为是无耻的; 1193

RMI 实现的rpc 远程过程调用 Java

在前面一片文章里面 ,简单的实现了keras 深度学习的数字识别程序代码 后 ,一直就在想 训练出来的模型怎么包装成SOA 服务使用,咨询了下京东 金融的同事 ,他们使用的是京东自己的soa 框架 jsf ,还有就是当当网的dubbox ,这个是源于阿里的dubbo。最近也看到一个朋友的简历上有很多关于dubbo 的描述 ,看来业界对这个还是情...

110

YOLO + Qwen3-VL-Seg 深度诊断:双引擎协同完成AI质检

本文提出了一种创新的工业质检双引擎架构,结合YOLO实时检测与Qwen3-VL-Seg精细化诊断,有效解决了传统检测方法中检测与诊断割裂的问题。YOLO部署在边缘端实现高效定位(3.2MB模型,<10ms延迟),Qwen3-VL-Seg在云端完成语义级缺陷分析(仅17M参数的解码器实现像素级分割)。该方案通过6步闭环流程,从实时感知到工艺反哺,显著提升了工业质检的准确性和可解释性,为智能制造提供了从"发现"到"解决"的完整技术路径。

mingo_敏 227

Dubbo(一) 使用Java RMI 实现RPC(远程过程调用)

Java RMI(Remote Method Invocation) 是jdk1.2 引入的一套Java自带RPC实现方案。 实现过程如下: 一、远程服务端 编写远程接口继承java.rmi.Remote 接口 编写远程接口实现类并继承java.rmi.server.UnicastRemoteObject 类 编写远程启动类,实现指定注册服务端口并注册实例到rmi注册服务器上 二、客户端 编写本地接口继承java.rmi.Remote 接口,与远程服务端接口保持包名参数等一致。 使用Nami.

liuhenghui5201的专栏 884

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

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

基于 Spring 的远程过程调用(RPC):RMI、Hessian/Burlap、Spring HttpInvoker 四种实现方式详解...

一 简介 在Java开发中,我们可以使用多种远程调用技术,如: 远程方法调用(Remote Method Invocation,RMI) Caucho的Hessian和Burlap Spring基于HTTP的远程服务 SOAP和RESTful风格的Web Service 注:关于Web Service可以自行参考我之前写过的相关文章(PS:www.zifangsky.cn/webservice...

weixin_34238642的博客 227

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java中RPC的简单实现即RMI、微服务

RMI(Remote Method Invocation):远程方法调用 RPC(Remote Procedure Call):远程过程调用 其中的核心思想或步骤是:通过网络通信,一个网络端调用另一个网络端的方法(过程),实现相对应的功能,得到相应的结果。RMI即JAVA中RPC的实现。“invocation”意为“反射”,也就是说明利用了java中的反射机制实现的。 从应用角度来分析,客户...

coinph的博客 827

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

简述你对RPC、RMI的理解

RPCRMI直接或间接实现接⼝ java.rmi.Remote 成为存在于服务器端的远程对象,供客户端访问并提供⼀定的服务远程对象必须实现java.rmi.server.UniCastRemoteObject类,这样才能保证客户端访问获得远程对象 时,该远程对象将会把⾃身的⼀个拷⻉以Socket的形式传输给客户端,此时客户端所获得的这个拷⻉称为“存根”,⽽服务器端本身已存在的远程对象则称之为“⻣架”。其实此时的存根是客户端的⼀个代理,

完全体 1213

轻松理解RPC及RMI

温馨提示:本篇完整代码已上传至https://github.com/Monkey-yc/RMI,欢迎访问! RPC(Remote Procedure Call Protocol):远程过程调用协议,通过网络从远程计算机上请求调用某种服务。 RMI(Remote Method Invocation):远程方法调用,能够让在客户端Java虚拟机上的对象像调用本地对象一样调用服务端java 虚拟机中的...

Monkey-yc 3986

简单实现的RPC

RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地服务一样调用远程服务。它可以有不同的实现方式。如RMI(远程方法调用)、Hessian、Http invoker等。另外,RPC是与语言无关的。InvokeModel类,封装了参数类型、参数值、服务接口/* * 文件名:InvokeModel.java * 版权:Copyright

WuTing的专栏 2351

常用的RPC框架

常用的RPC框架 2018年02月05日 15:32:11 Simple_Yang92 阅读数:1787 标签: RPC 更多 个人分类: 分布式 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/u013952133/article/details/79256799 1. 为什么要使用RPC?   RPC(remote procedur...

weixin_42858906的博客 995

RPC框架-RMI

RMI(Remote Method Invocation)是Java语言中的一种RPC实现,它允许Java程序调用位于其他虚拟机中的Java对象上的方法。RMI的设计目标是通过对远程对象的调用,像处理本地对象一样处理远程对象,使分布式计算的复杂性对开发者透明化。远程对象:远程对象是一个可以通过网络进行调用的对象。它的类必须实现接口,并通过类导出。远程接口:远程对象实现的接口必须继承Remote接口,接口中的每个方法必须抛出。客户端与服务端:RMI框架将远程对象的调用划分为客户端和服务端两部分。

Flying_Fish_roe的博客 1419

RPC、RMI基本介绍

定义RPC全称为remote procedure call,即远程过程调用。借助RPC可以做到像本地调用一样调用远程服 务,是一种进程间的通信方式。RPC并不是一个具体的技术,而是指整个网络远程调 用过程。本地调用 和 RPC调用 区别RPC过程时序图一个完整的RPC架构里面包含了四个核心的组件,分别是Client,Client Stub,Server以及Server Stub,这个Stub可以理解为存根。客户端(Client),服务的调用方。

CAUC_lin的博客 2895

RPC-RMI

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。 RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 运行时,一次客户机对服务器的RPC调

talent210的专栏 649
上一篇: Zookeeper分布式锁的实现
下一篇: RPC远程过程调用之Hessian 基于HTTP
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值