# RMI **Repository Path**: naclnezn/rmi ## Basic Information - **Project Name**: RMI - **Description**: RMI(Remote Method Invocation)即远程方法调用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-19 - **Last Updated**: 2024-10-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rmi ## 介绍 RMI(Remote Method Invocation)即远程方法调用,是分布式编程中的一个基本思想。 实现远程方法调用的技术有很多,比如CORBA、WebService,这两种都是独立于各个编程语言的。 而Java RMI是专为Java环境设计的远程方法调用机制,是一种用于实现远程调用(RPC,Remote Procedure Call)的Java API,能直接传输序列化后的Java对象和分布式垃圾收集。 它的实现依赖于JVM,因此它支持从一个JVM到另一个JVM的调用。 在Java RMI中,远程服务器实现具体的Java方法并提供接口,客户端本地仅需根据接口类的定义,提供相应的参数即可调用远程方法,其中对象是通过序列化方式进行编码传输的。 所以平时说的反序列化漏洞的利用经常是涉及到RMI,就是这个意思。 RMI依赖的通信协议为JRMP(Java Remote Message Protocol,Java远程消息交换协议),该协议是为Java定制的,要求服务端与客户端都必须是Java编写的。 ## 交互过程 ![1726719116144.png](imgs/1726719116144.png) ![1726719165764.png](imgs/1726719165764.png) 交互过程可简单概述为: - 首先,启动RMI Registry服务,启动时可以指定服务监听的端口,也可以使用默认的端口(1099); - 其次,Server端在本地先实例化一个提供服务的实现类,然后通过RMI提供的Naming/Context/Registry等类的bind或rebind方法将刚才实例化好的实现类注册到RMI Registry上并对外暴露一个名称; - 最后,Client端通过本地的接口和一个已知的名称(即RMI Registry暴露出的名称),使用RMI提供的Naming/Context/Registry等类的lookup方法从RMI Service那拿到实现类。这样虽然本地没有这个类的实现类,但所有的方法都在接口里了,便可以实现远程调用对象的方法了; ## 工程明细 - rmi-server 这是一个服务端工程,主要提供rmi service接口 - rmi-client 这是一个客户端工程,主要调用远程的rmi服务 - rmi-common 这是一个公共包,server和client都要引用 ## 测试 启动rmi-server服务 启动rmi-client服务 访问http://127.0.0.1:8081/customers/1000001 返回{"firstName":"John","lastName":"Smith","socialSecurityCode":"123-456-7890"}