RMI简介

这篇具有很好参考价值的文章主要介绍了RMI简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RMI 介绍

RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中的对象,调用另一个 JVM 中的对象方法并获取调用结果。这里的另一个 JVM 可以在同一台计算机也可以是远程计算机。因此,RMI 意味着需要一个 Server 端和一个 Client 端。

Server 端通常会创建一个对象,并使之可以被远程访问。

这个对象被称为远程对象。Server 端需要注册这个对象可以被 Client 远程访问。

Client 端调用可以被远程访问的对象上的方法,Client 端就可以和 Server 端进行通信并相互传递信息。

RMI 工作原理

正所谓 “知其然知其所以然”,在开始编写 RMI 代码之前,有必要了解一下 RMI 的工作原理,RMI 中 Client 端是和 Server 端是如何通信的呢?

下图的可以帮助我们理解RMI 的工作流程。

RMI简介,RMI,java

从图中可以看到,Client 端有一个被称 Stub 的东西,有时也会被成为存根,它是 RMI Client 的代理对象,Stub 的主要功能是请求远程方法时构造一个信息块,RMI 协议会把这个信息块发送给 Server 端。

这个信息块由几个部分组成:

  • 远程对象标识符。

  • 调用的方法描述。

  • 编组后的参数值(RMI协议中使用的是对象序列化)。

既然 Client 端有一个 Stub 可以构造信息块发送给 Server 端,那么 Server 端必定会有一个接收这个信息快的对象,称为 Skeleton 。

它主要的工作是:

  • 解析信息快中的调用对象标识符和方法描述,在 Server 端调用具体的对象方法。

  • 取得调用的返回值或者异常值。

  • 把返回值进行编组,返回给客户端 Stub.

到这里,一次从 Client 端对 Server 端的调用结果就可以获取到了。

RMI 配置:

1.定义传输的对象,传输的对象需要实现序列化(Serializable)接口。

 public class Emp implements Serializable {
     private Integer empNo;
     private String empName;
     private String addr;
     
     //省略 get/set
     @Override
     public String toString() {
         return "Emp{" +
                 "empNo=" + empNo +
                 ", empName='" + empName + '\'' +
                 ", addr='" + addr + '\'' +
                 '}';
     }
 }

Server 端主要是构建一个可以被传输的类 User,一个可以被远程访问的类 UserService,同时这个对象要注册到 RMI 开放给客户端使用。

2.定义服务器接口(需要继承 Remote 类,方法需要抛出 RemoteException)。

 public interface EmpService extends Remote {
     void addEmp(Emp emp) throws RemoteException;
     Emp findEmpById(Integer empNo) throws RemoteException;
 ​
 }

3.实现服务器接口(需要继承 UnicastRemoteObject 类,实现定义的接口)。

 
public class EmpServiceImpl extends UnicastRemoteObject implements EmpService {
     public EmpServiceImpl() throws RemoteException {
         super();
 ​
     }
 ​
     @Override
     public void addEmp(Emp emp) throws RemoteException {
         System.out.println(emp);
         System.out.println("保存数据成功。");
 ​
     }
 ​
     @Override
     public Emp findEmpById(Integer empNo) throws RemoteException {
         System.out.println("id:" + empNo);
         System.out.println("查询数据成功。");
         Emp emp = new Emp();
         emp.setEmpNo(empNo);
         emp.setEmpName("测试数据");
         emp.setAddr("测试数据");
         return emp;
 ​
     }
 }

4.注册( rmiregistry)远程对象,并启动服务端程序。

服务端绑定了 UserService 对象作为远程访问的对象,启动时端口设置为 2022。

 public class TestServer {
     public static void main(String[] args) throws Exception {
         EmpService imp = new EmpServiceImpl();
         //注册远程服务的端口
         LocateRegistry.createRegistry(2022);
         //将远程服务对象绑定为远程服务
         Naming.rebind("rmi://127.0.0.1:2022/a", imp);
         System.out.println("server启动成功。。。");
 ​
 ​
     }
 }

RMI Client

相比 Server 端,Client 端就简单的多。直接引入可远程访问和需要传输的类,通过端口和 Server 端绑定的地址,就可以发起一次调用。

 public class TestClient {
     public static void main(String[] args) throws Exception {
         EmpService server = (EmpService) Naming.lookup("rmi://127.0.0.1:2022/a");
         System.out.println("server:"+server);
         //远程方法调用
         Emp emp = new Emp();
         emp.setAddr("tj");
         emp.setEmpName("喵星兔");
         emp.setEmpNo(2021);
         server.addEmp(emp);
 ​
         System.out.println(server.findEmpById(100));
 ​
     }
 }

RMI 测试

启动 Server 端。

server启动成功。。。

启动 Client 端。

Emp{empNo=100, empName='测试数据', addr='测试数据'}文章来源地址https://www.toymoban.com/news/detail-789707.html

到了这里,关于RMI简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Java问题解决:严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXmlParser.par

    Java问题解决:严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXmlParser.par

     tomcat服务器启动是,出现多个严重错误: 这类问题很可能是配置文件错误,经检查后发现,是web.xml文件出现问题:  load-on-startup/load-on-startup中未输入参数,改成

    2024年02月11日
    浏览(8)
  • RMI反序列化分析

    RMI反序列化分析

    RMI全程Remote Method Invocation (远程方法引用),RMI有客户端和服务端,还有一个注册中心,在java中客户端可以通过RMI调用服务端的方法,流程图如下: 服务端创建RMI后会在RMI Registry(注册中心)注册,之后客户端都是从注册中心调用方法,RMI分为三个主体部分: Client-客户端

    2024年03月26日
    浏览(12)
  • 漏洞名称:RMI 未授权访问漏洞

    漏洞描述:RMI默认使用序列化来完成所有的交互,如果该端口暴露在公网上,且使用了Apache Commons Collections的漏洞版本,就可以在该服务器上执行相关命令。 漏洞危害:攻击者可在没有认证的情况下直接操作对应的 API 接口,可直接被非法增删改次数据。且因为攻击是在未认证下

    2024年02月06日
    浏览(8)
  • Http\Rpc\Rmi

    目录 Http Rpc Rmi HTTP协议: 目的:HTTP(超文本传输协议)协议是用于在客户端和服务器之间传输超文本和其他数据的协议,是Web应用程序的基础。 通信方式:HTTP协议使用TCP/IP协议作为传输协议,通过请求-响应模型进行通信。客户端发送HTTP请求到服务器,服务器返回HTTP响应给

    2024年02月07日
    浏览(11)
  • 安全学习_开发相关_JNDI介绍(注入)&RMI&LDAP服务

    https://blog.csdn.net/dupei/article/details/120534024 高版本绕过参考: https://www.mi1k7ea.com/2020/09/07/%E6%B5%85%E6%9E%90%E9%AB%98%E4%BD%8E%E7%89%88JDK%E4%B8%8B%E7%9A%84JNDI%E6%B3%A8%E5%85%A5%E5%8F%8A%E7%BB%95%E8%BF%87/ https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html 什么是jndi注入 为什么有jndi注入 JDNI注入安全

    2024年02月03日
    浏览(9)
  • 037-安全开发-JavaEE应用&JNDI注入&RMI服务&LDAP服务&JDK绕过&调用链类

    037-安全开发-JavaEE应用&JNDI注入&RMI服务&LDAP服务&JDK绕过&调用链类

    1、JavaEE-JNDI注入-RMILDAP 2、JavaEE-漏洞结合-FastJson链 3、JavaEE-漏洞条件-JDK版本绕过 演示案例: ➢JNDI注入-RMILDAP服务 ➢JNDI注入-FastJson漏洞结合 ➢JNDI注入-JDK高版本注入绕过 思考明白: 什么是jndi注入 为什么有jndi注入 JDNI注入安全问题 JDNI注入利用条件 参考:https://blog.csdn.net/

    2024年04月10日
    浏览(10)
  • Tomcat项目报错:严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInter

    Tomcat项目报错:严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInter

    严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ContainerBase.addChildInternal ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/1_demo_war]] 在src/main/webapp/WEB-INF/web.xml文件中配置Servlet时,映射地址中没有/ 正

    2024年01月16日
    浏览(19)
  • Tomcat出现警告:[RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion

    Tomcat出现警告:[RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion

    解决方案 tomcat、JDK、web.xml 对应关系,向下兼容 web.xml——version2.2——JDK1.1——Tomcat3.3 web.xml——version2.3——JDK1.3——Tomcat4.1 web.xml——version2.4——JDK1.4——Tomcat5.5 web.xml——version2.5——JDK5.0——Tomcat6.0 web.xml——version3.0——JDK6.0——Tomcat7.0 web.xml——version3.1——JDK7.0——

    2024年02月05日
    浏览(31)
  • Java 集合框架体系简介

    Java 集合框架体系简介

    存储多个数据可以使用数组,但由于数组在内存中是连续存储的,所以会有一些限制。比如数组在创建时就要指定长度,即可以容纳的元素个数,且指定后无法更改;数组在创建时需要指定元素的类型,并且所有元素都必须是该类型或其子类;添加或删除数组中的元素需要创

    2024年02月08日
    浏览(14)
  • 1 java简介

    Java是一种计算机编程语言,可以用它来编写所有种类的应用程序,包括桌面应用程序、移动应用程序、Web应用程序等等。Java还拥有跨平台的特性,这意味着您可以在多种操作系统和设备上运行Java应用程序。 Java仍然是非常热门的一门编程语言,具有良好的就业前景。Java语言

    2023年04月26日
    浏览(5)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包