使用RMI实现RPC

news2024/12/25 22:13:58

1 RMI简介

RMI(Remote Method Invocation) 远程方法调用。

RMI是从JDK1.2推出的功能,它可以实现在一个Java应用中可以像调用本地方法一样调用另一个服务器中Java应用(JVM)中的内容。

RMI 是Java语言的远程调用,无法实现跨语言。

2 执行流程

 

Registry(注册表)是放置所有服务器对象的命名空间。 每次服务端创建一个对象时,它都会使用bind()或rebind()方法注册该对象。 这些是使用称为绑定名称的唯一名称注册的。

要调用远程对象,客户端需要该对象的引用。即通过服务端绑定的名称从注册表中获取对象(lookup()方法)。

3 API介绍

3.1 Remote

java.rmi.Remote 定义了此接口为远程调用接口。如果接口被外部调用,需要继承此接口。

public interface Remote{}

3.2 RemoteException

java.rmi.RemoteException

继承了Remote接口的接口中,如果方法是允许被远程调用的,需要抛出此异常。

3.3 UnicastRemoteObject

java.rmi.server.UnicastRemoteObject

此类实现了Remote接口和Serializable接口。

自定义接口实现类除了实现自定义接口还需要继承此类。

3.4 LocateRegistry

java.rmi.registry.LocateRegistry

可以通过LocateRegistry在本机上创建Registry,通过特定的端口就可以访问这个Registry。

3.5 Naming

java.rmi.Naming

Naming定义了发布内容可访问RMI名称。也是通过Naming获取到指定的远程方法。

4 代码实现

4.1 服务端创建

创建RmiServer项目

4.1.1 编写接口

com.msb.service.DemoService 编写

public interface DemoService extends Remote {
    String demo(String demo) throws RemoteException;
}

4.1.2 编写实现类

com.msb.service.impl.DemoServiceImpl 编写。

注意:构造方法是public的。默认生成protected

public class DemoServiceImpl extends UnicastRemoteObject implements DemoService {
    public DemoServiceImpl() throws RemoteException {
    }
    @Override
    public String demo(String demo) throws RemoteException {
        return demo+"123";
    }
}

4.1.3 编写主方法

编写com.msb.DemoServer类,生成主方法

public class DemoServiceImpl extends UnicastRemoteObject implements DemoService {
    public DemoServiceImpl() throws RemoteException {
    }
    @Override
    public String demo(String demo) throws RemoteException {
        return demo+"123";
    }
}

4.1.4 运行项目

运行后项目,项目一直处于启动状态,表示可以远程访问此项目中的远程方法。

4.2 创建客户端代码

创建项目RmiClient

4.2.1 复制服务端接口

把服务端com.msb.service.DemoService粘贴到项目中

4.2.2 创建主方法类

新建com.msb.DemoClient

public class DemoServiceImpl extends UnicastRemoteObject implements DemoService {
    public DemoServiceImpl() throws RemoteException {
    }
    @Override
    public String demo(String demo) throws RemoteException {
        return demo+"123";
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LVGL自定义组件__页面指示器

前言 LVGL对硬件的要求非常低,使用其自带的组件能够搭建出精美的界面,动效也很棒。但是如过移植到Linux平台下,开发稍微复杂的应用项目,那些组件就远远不够用了。为此需要自己自定义一些组件,以方便实用。 效果 为此…

D-star Lite算法及相关思考

一、D-star Lite算法简介 1994年 Anthony Stentz在论文Optimal and Efficient Path Planning for Partially-known Environments中提出了D*算法 D * 算法采用逆向搜索,从目标点向起始点搜索规划,可以处理环境部分未知或全部未知以及动态障碍的一些情况。…

神经网络入门(一)

神经网络入门(一) 文章目录神经网络入门(一)1. 神经元2. 网络结构3. 激活函数2.1 激活函数的作用与性质2.2 Sigmoid型函数2.3 Hard-Logistic函数和 Hard-Tanh函数2.4 ReLU函数2.5 常见的激活函数及其导数4. 前馈神经网络4.1 前馈神…

DAY05-网页布局实战选择器CSS样式

文章目录网页布局实战一 CSS选择器a.基本选择器1.元素选择器2.类选择器3.id选择器b.复杂选择器c 伪选择器d 伪元素选择器二 CSS常用样式1.文本相关属性2.背景属性1)背景颜色2)背景图片3)背景平铺4)背景位置5)设置背景图片大小:6)background 背景复合属性案例1案例2案…

Session的使用

Session的使用Session概述Session特性Session原理Session对象操作获取Session对象-----getSession获取SessionID------getId向Session对象存储/修改数据-----setAttribute获取数据------getAttribute删除数据----removeAttributeSession对象失效Session概述 Session对象&#…

rust编程-rust所有权理解(chapter 4.2 引用实质是借用)

目录 2. 引用与借用 2.1 可变(mutable)引用 2.2 悬空(dangling)引用 2.3 引用的规则总结 2. 引用与借用 上一章节中提到,所有权在函数调用中的转移,函数返回必须同时返还所有权,才能使函数调用后能继续使用某个变量…

[附源码]计算机毕业设计勤工助学管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

jquery 登录-记住密码

jquery 登录-记住密码在登录时,添加记住密码功能:用的 localStorage 存储和获取登录信息 //存储 var username $("input[nameusername]").val(); var password $("input[namepassword]").val(); var validateCode $("inpu…

自动驾驶:2022 apollo day 观后感(一)

2022 apollo day 观后感(一)注: ppt来自apollo day,结合ppt,讲述一些自己的想法,欢迎批评指正!Topic One -- 打造安全、智能、高效的自动驾驶技术体系(陈竞凯)无人驾驶技…

Ruby ERB模板注入检测

了解Ruby ERB模板注入,Ruby ERB模板注入检测。 ERB是Ruby自带的 <% 写逻辑脚本(Ruby语法) %><%= 直接输出变量值或运算结果 %>require erbtemplate = "text to be generated: <%= x %>" erb_object = ERB.new(template) x = 5 puts erb_object.r…

[附源码]JAVA毕业设计人才公寓管理系统(系统+LW)

[附源码]JAVA毕业设计人才公寓管理系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…

Linux——Xshell、Xftp实现Linux远程登录与应用

目录 一、远程登录 1.1 SSH登录方式 二、Xshell远程连接 2.1 远程连接 2.2 设置粘贴复制 三、Xftp远程连接 3.1 远程连接 3.2 解决乱码 3.3 传输文件 一、远程登录 通常在工作过程中&#xff0c;公司中使用的真实服务器或者是云服务器&#xff0c;都不允许除运维人员 之…

微电网优化调度|农村农业区可再生能源微电网优化调度(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

软件测试就业现状分析,2023是卷还是润?

一、当前软件测试的现状是什么&#xff1f; 现状1、网络上大量人唱衰&#xff0c;测试就业不行了 2022年5月后&#xff0c;越来越多人网络发声“互联网行业不行了”。贴吧、知乎、小红书上&#xff0c;也有大量人反馈软件测试就业惨淡……&#xff0c;篇幅有限&#xff0c;仅…

Docker学习4-常用命令之重要的容器命令

本文是Docker学习系列教程中的第四篇。本文是Docker常用命令中的重要命令。为什么说重要呢&#xff1f;因为这些命令&#xff0c;在以后开发过程中&#xff0c;会经常使用到。比如&#xff1a;怎么查看容器中运行的日志&#xff1f;怎么查看容器运行的进程&#xff1f;怎么导出…

最新中文版本FLStudio21水果音乐软件更新下载

导读&#xff1a;昨晚Image-Line发布FL Studio 2023&#xff0c;而今年也是他们成立第23周年。FL21一经发行便引起了广大制作人的关注&#xff0c;今天我们来介绍一下这款软件。FL Studio是一款音乐编曲软件&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;也是我…

实战:Kind部署k8s集群-2022.12.6(成功测试)

写在前面 原文阅读效果更佳&#xff1a;实战&#xff1a;Kind部署k8s集群-2022.12.6(成功测试) 语雀 《实战&#xff1a;Kind部署k8s集群-2022.12.6(成功测试)》 Kind Kind 是 Kubernetes in Docker 的简写&#xff0c;是一个使用 Docker 容器作为 Node 节点&#xff0c;在…

通关算法题之 ⌈栈和队列⌋

栈和队列 155. 最小栈 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取…

文件系统实现

文件系统实现&#x1f3de;️1. 整体组织&#x1f301;2. 文件组织&#xff1a;inode&#x1f320;3. 多级索引&#x1f4d6;3.1 间接指针&#x1f4d6;3.2 多重间接指针&#x1f4d6;3.3 基于范围的方法&#x1f30c;4. 目录组织⛺5. 空闲空间管理&#x1f33f;6. 读取和写入文…

Vue 官方文档2.x教程学习笔记 1 基础 1.7 条件渲染

Vue 官方文档2.x教程学习笔记 文章目录Vue 官方文档2.x教程学习笔记1 基础1.7 条件渲染1.7.1 v-if1.7.2 在\<template> 元素上使用 v-if条件渲染分组1.7.3 v-else1.7.4 v-else-if1.7.5 用 key 管理可复用的元素1.7.6 v-show1.7.7 v-if vs v-show1.7.8 v-if 与 v-for 一起…