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 的工作流程。

img

从图中可以看到,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@Overridepublic 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();​}​@Overridepublic void addEmp(Emp emp) throws RemoteException {System.out.println(emp);System.out.println("保存数据成功。");​}​@Overridepublic 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='测试数据'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/238233.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我为什么要写RocketMQ消息中间件实战派上下册这本书?

我与RocketMQ结识于2018年,那个时候RocketMQ还不是Apache的顶级项目,并且我还在自己的公司做过RocketMQ的技术分享,并且它的布道和推广,还是在之前的首席架构师的带领下去做的,并且之前有一个技术神经质的人&#xff0…

13 | 使用代理ip爬取安居客房源信息

这是一个简单的Python爬虫代码,用于从安居客网站爬取房地产信息。该爬虫使用了代理IP来绕过可能的封禁,并提供了一些基本的信息抽取功能。 如果访问过多,那么可能出现了验证码 对此,最好的方法就是换ip。 使用代理IP的主要目的是保护爬虫的稳定性和隐私。以下是一些常见的原…

Qt/QML编程学习之心得:一个音频播放器的实现(29)

在window下,打开音乐播放器,然后打开一个.mp3文件,就可以实现播放了,那么在Qt/QML中如何实现呢?首先所有的设计都是基于音乐播放器的,嵌入式linux下同样也有音乐播放器,比如mplayer。其调用方法如下,可以启动一个从头开始播放音频的mplayer进程。 那么音频播放器就是给…

【WPF.NET开发】WPF中的版式

本文内容 改进的文本质量和性能丰富的版式增强的国际文本支持增强的字体支持新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。…

Material Design 进阶(十一)——Chip,ChipGroup,ChipDrawable使用

流式布局标签发展历程 第一阶段:实现这种界面的时候,基本都是自定义一个控件,然后在Java代码中动态的 添加一个个的TextView,还需要计算布局宽度/高度,进行换行等等处理,比较复杂;第二阶段:使用…

tailwindcss真的好用吗?

写在前面 今天写一篇关于tailwindcss 的文章,其实这个css技术已经出现很久了,在一些大型项目很多人也已经在用了,虽然不是说必须要会吧,但是没听说过肯定是不行的,他的操作逻辑应该是和unocss差不多,但是今…

1 快速前端开发

前端开发 1 前端开发1.快速开发网站2.浏览器能识别的标签2.1 编码(head)2.2 title(head)2.3 标题2.4 div和span2.4.5 超链接2.4.6 图片小结2.4.7 列表2.4.8 表格2.4.9 input系列(7个)2.4.10 下拉框2.4.11 多…

01 SpringMVC的快速理解

1.1 如图所示,SpringMVC负责表述层(控制层Controller)实现简化! SpringMVC的作用主要覆盖的是表述层,例如: 请求映射、数据输入、视图界面、请求分发、表单回显、会话控制、过滤拦截、异步交互、文件上传…

python 列表的高级应用

当前版本: Python 3.8.4 简介 列表(list)是Python编程语言中的基本数据类型之一,也是一个非常重要的通用序列。在其它编程语言中,它们通常被称为“数组”。可以存储多个元素,包括数字、字符串、甚至其他列…

机器学习 | 无监督聚类K-means和混合高斯模型

机器学习 | 无监督聚类K-means和混合高斯模型 1. 实验目的 实现一个K-means算法和混合高斯模型,并用EM算法估计模型中的参数。 2. 实验内容 用高斯分布产生 k k k个高斯分布的数据(不同均值和方差)(其中参数自己设定&#xff…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷⑩

单元测试 一、任务要求 题目1:根据下列流程图编写程序实现相应处理,程序根据两个输入参数iRecordNum和IType计算x的值并返回。编写程序代码,使用JUnit框架编写测试类对编写的程序代码进行测试,测试类中设计最少的测试数据满足基路…

shp文件与数据库(创建shp文件)

前言 前面把shp文件中的内容读取到数据库,接下来就把数据库中的表变成shp文件。 正文 简单的创建一个shp文件 暂时不读取数据库的表,先随机创建一个shp文件。既然是随机的,这就需要使用到faker这个第三方库,代码如下。 impor…

【排序】快速排序(C语言实现)

文章目录 前言1. Hoare思想2. 挖坑法3. 前后指针法4. 三路划分5. 快速排序的一些小优化5.1 三数取中常规的三数取中伪随机的三数取中 5.2 小区间优化 6. 非递归版本的快排7. 快速排序的特性总结 前言 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其…

格密码基础:SIS问题的困难性

目录 一. SIS问题的困难性 二. SIS问题归约的性质 2.1 2004年 [MR04] 2.2 2008年 【GPV08】 2.3 2013年【MP13】 三. 归约证明 3.1 核心理解 3.2 归约步骤 3.3 性质理解 一. SIS问题的困难性 推荐先阅读: 格密码基础:SIS问题的定义与理解-CSD…

【Linux】应用与驱动交互及应用间数据交换

一、应用程序与 Linux 驱动交互主要通过以下几种方式: 1. 系统调用接口(System Calls): 应用程序可以通过系统调用,如 open(), read(), write(), ioctl(), 等来与设备驱动进行交互。这些调用最终会通过内核转发到相应的驱动函数…

感染嗜肺军团菌是什么感觉?

记录一下最近生病的一次经历吧,可能加我好友的朋友注意到了,前几天我发了个圈,有热心的朋友还专门私信了我说明了他自己的情况和治疗经验,感谢他们。 ​ 那么关于这次生病的经历,给大家分享一下。 首先,这次…

解锁 JavaScript 数组的强大功能:常用方法和属性详解(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

70.网游逆向分析与插件开发-角色数据的获取-自动化助手UI显示角色数据

内容参考于:易道云信息技术研究院VIP课 上一个内容:利用技能点属性分析角色数据基址-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:367aa71f60b…

C++ 完成Client分页显示log

分页显示t_log 1、获取用户的输入 1.1、写一个Input成员函数&#xff0c;处理输入进来的语句 std::string XClient::Input() {//清空缓冲//cin.ignore(4096, \n);string input "";for (;;){char a getchar();if (a < 0 || a \n || a \r)break;cout <<…

蓝桥杯准备

书籍获取&#xff1a;Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评&#xff1a;(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单&#xff0c;但是拿奖是一回事&#xff0c;拿什么奖又是一回事。况且&#xff0c;如果…