当前位置: 首页 > news >正文

RMI简易实现(基于maven)

参考其它rmi(remote method invocation)的代码后,加入了自己思考。整个工程基于maven构建,我觉得maven的模块化可比较直观地演示rmi

目录

项目结构图

模块解读

pom文件

rmi-impl

rmi-common-interface

rmi-server

rmi-client

 各模块源码

rmi-common-interface

RemoteInterface.java

rmi-server

RMIServer.java

RMIServerProperties.java

rmi-client

 RMIClient.java

 启动说明(重要)

运行截图

启动服务是的控制台信息

​编辑客户端连接服务端并发送消息

服务端控制台再次打印信息


项目结构图

模块解读

整个工程rmi-impl分为三个子模块

1、rmi-commom-interface:rmi-server与rmi-client都依赖的模块,用来定义供服务端实现、供客户端调用的公共远程调用接口

2、rmi-server:实现远程调用接口,并注册服务

3、rmi-client:拉去服务,并调用远程接口

pom文件

rmi-impl

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>psn.kiko</groupId><artifactId>rmi-impl</artifactId><packaging>pom</packaging><version>1.0-SNAPSHOT</version><modules><module>rmi-common-interface</module><module>rmi-server</module><module>rmi-client</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

rmi-common-interface

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>rmi-impl</artifactId><groupId>psn.kiko</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>rmi-common-interface</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

rmi-server

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>rmi-impl</artifactId><groupId>psn.kiko</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>rmi-server</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><--依赖common模块--><dependencies><dependency><groupId>psn.kiko</groupId><artifactId>rmi-common-interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

rmi-client

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>rmi-impl</artifactId><groupId>psn.kiko</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>rmi-client</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><--依赖common模块--><dependencies><dependency><groupId>psn.kiko</groupId><artifactId>rmi-common-interface</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

 各模块源码

rmi-common-interface

RemoteInterface.java

package psn.kiko.rmi.common;import java.rmi.Remote;
import java.rmi.RemoteException;/*** 声明远程服务接口,此接口里声明的方法,由服务端实现,供客户端调用。* 鉴于此,将所有远程接口都放到common模块,并在需要此接口的模块引入<br>* on 2023/2/15 18:03*/
public interface RemoteInterface extends Remote {/*** 此方法将会在服务端打印message:由rmi-server模块实现,由rmi-client远程调用* @param message* @throws RemoteException*/void printMsg(String message) throws RemoteException;
}

rmi-server

RMIServer.java

package psn.kiko.rmi.server;import psn.kiko.rmi.common.RemoteInterface;import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;/*** rmi服务端<br>* on 2023/2/15 18:08*/
public class RMIServer extends UnicastRemoteObject implements RemoteInterface {// 运行main注册服务public static void main(String[] args) {try {rmiServerRegistration();} catch (RemoteException | MalformedURLException | AlreadyBoundException e) {e.printStackTrace();}}private RMIServerProperties serverProperties;public void setServerProperties(RMIServerProperties serverProperties) {this.serverProperties = serverProperties;}public RMIServerProperties getServerProperties() {return serverProperties;}protected RMIServer() throws RemoteException {}@Overridepublic void printMsg(String message) throws RemoteException {System.out.println(this.serverProperties.getSeverName()+"获得客户端消息: "+message);}/*** rmi服务注册:添加到虚拟机注册表* @throws RemoteException* @throws AlreadyBoundException* @throws MalformedURLException*/private static void rmiServerRegistration() throws RemoteException, AlreadyBoundException, MalformedURLException {RMIServer rmiServer = new RMIServer();rmiServer.setServerProperties(new RMIServerProperties(8888, "rmi-server"));LocateRegistry.createRegistry(rmiServer.getServerProperties().getServerPort());Naming.bind(rmiServer.getServerProperties().getServerUrl(), rmiServer);System.out.println(rmiServer.getServerProperties().getSeverName()+"已启动================>");}
}

RMIServerProperties.java

 

package psn.kiko.rmi.server;/*** 服务端参数<br>* on 2023/2/15 18:41*/
public class RMIServerProperties {private String serverUrl; //服务端通信地址private int serverPort;//服务端端口private String severName;//服务名称public RMIServerProperties(int serverPort,String serverName) {this.severName=serverName;this.serverPort = serverPort;this.serverUrl ="rmi://localhost:"+serverPort+"/"+severName;}public String getServerUrl() {return serverUrl;}public int getServerPort() {return serverPort;}public String getSeverName() {return severName;}
}

rmi-client

 RMIClient.java

package psn.kiko.client;import psn.kiko.rmi.common.RemoteInterface;import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Scanner;/*** rmi客户端<br>* on 2023/2/15 18:19*/
public class RMIClient {// 运行main获取远程服务,并向其传输messagepublic static void main(String[] args) {try {RemoteInterface rmiServer = (RemoteInterface)Naming.lookup("rmi://localhost:8888/rmi-server");Scanner scanner = new Scanner(System.in);System.out.println("请输入需要发送给服务端的信息=============>");String message = scanner.next();rmiServer.printMsg(message);System.out.println("客户端发送消息完毕<=====================");} catch (NotBoundException | MalformedURLException | RemoteException e) {e.printStackTrace();}}
}

 启动说明(重要)

先运行RMIServer.main(启动后将等待客户端连接),再运行RMIClient.main(可多次单独运行,进行多次连接通信)

运行截图

启动服务是的控制台信息

截图中的红色正方形也表示服务程序启动后就一直运行着

客户端连接服务端并发送消息

灰色正方形表示客户端与服务端通信完毕就断开连接

服务端控制台再次打印信息

红色正方形表示服务端与客户端通信完毕后仍在运行

以上就是全部关于RMI的详细基础用法了

 

 

相关文章:

RMI简易实现(基于maven)

参考其它rmi&#xff08;remote method invocation&#xff09;的代码后&#xff0c;加入了自己思考。整个工程基于maven构建&#xff0c;我觉得maven的模块化可比较直观地演示rmi 目录 项目结构图 模块解读 pom文件 rmi-impl rmi-common-interface rmi-server rmi-cli…...

‘excludeSwitches‘ 的 [‘enable-logging‘] 和[‘enable-automation‘]

selenium 使用 chrome 浏览器的 chromedriver 时&#xff0c;可以加参数&#xff0c; chrome_optionswebdriver.ChromeOptions() chrome_options.add_experimental_option(excludeSwitches,[enable-logging]) chrome_options.add_experimental_option(excludeSwitches,[enable…...

华为OD机试 - 最短木板长度(Python)| 真题+思路+考点+代码+岗位

最短木板长度 题目 小明有 n n n 块木板,第 i i i(1≤ i i...

第一个Python程序-HelloWorld与Python解释器

数据来源 01 第一个Python程序-HelloWorld 1&#xff09;打开cmd&#xff1a; windows R 打开运行窗口输入cmd 2&#xff09;进入Python编写页面 输入&#xff1a;python 3&#xff09;然后输入要写的Python代码然后回车 print("Hello World!!!") print() …...

C++数据类型

目录 一、基本的内置类型 二、typedef声明 三、枚举类型 一、基本的内置类型 C 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C 数据类型&#xff1a; 类型关键字布尔型bool字符型char整型int浮点型float双浮点型double无类型void宽…...

华为OD机试 - 考古学家(Python)| 真题+思路+考点+代码+岗位

考古学家 题目 有一个考古学家发现一个石碑 但是很可惜 发现时其已经断成多段 原地发现 N 个断口整齐的石碑碎片 为了破解石碑内容 考古学家希望有程序能帮忙计算复原后的石碑文字组合数 ,你能帮忙吗 备注: 如果存在石碑碎片内容完全相同,则由于碎片间的顺序不影响复原后…...

常用调试golang的bug以及性能问题的实践方法

文章目录如何分析程序运行时间和CPU利用率情况1.shell内置time指令/usr/bin/time指令如何分析golang程序的内存使用情况&#xff1f;1.内存占用情况查看如何分析golang程序的CPU性能情况1.性能分析注意事项2.CPU性能分析A.Web界面查看B.使用pprof工具查看如何分析程序运行时间和…...

什么是溶血症?什么是ABO溶血?溶血检查些什么?

什么是溶血症&#xff0c;什么是ABO溶血&#xff1f;女人是O型血&#xff0c;男人是其他血型的夫妻配对&#xff0c;最担心的是胎儿溶血症。从理论上讲&#xff0c;只要夫妻双方血型不同&#xff0c;母亲一定缺乏胎儿从父亲那里遗传的抗原。当任何人接触到他们缺乏的抗原时&…...

NLP实践——知识图谱问答模型FiD

NLP实践——知识图谱问答模型FiD0. 简介1. 模型结构2. 召回3. 问答4. 结合知识的问答0. 简介 好久没有更新了&#xff0c;今天介绍一个知识图谱问答&#xff08;KBQA&#xff09;模型&#xff0c;在此之前我一直在用huggingface的Pipeline中提供的QA模型&#xff0c;非常方便但…...

MyBatis 多表关联查询

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

《NFL橄榄球》:克利夫兰布朗·橄榄1号位

克利夫兰布朗&#xff08;英语&#xff1a;Cleveland Browns&#xff09;是一支职业美式橄榄球球队&#xff0c;位于俄亥俄州克利夫兰。 布朗隶属于美国全国橄榄球联盟(NFL)的北区&#xff0c;主场位于第一能源体育场。球队在1946年与AAFC联盟一同成立&#xff0c;并在1946年到…...

InstructGPT笔记

一、InstructGPT是在GPT3上微调&#xff0c;ChatGPT是在GPT3.5上微调 二、该论文展示了怎么样对语言模型和人类意图之间进行匹配&#xff0c;方法是在人类的反馈上进行微调。 **三、方法简介&#xff1a;**收集很多问题&#xff0c;使用标注工具将问题的答案写出来&#xff0…...

【uniapp】getOpenerEventChannel().once 接收参数无效的解决方案

uniapp项目开发跨平台应用常会遇到接收参数无效的问题&#xff0c;无法判断是哪里出错了&#xff0c;这里是讲替代的方案&#xff0c;现有三种方案可选。 原因 一般我们是这样处理向另一个页面传参&#xff0c;代码是这样写的 //... let { title, type, rank } args; uni.n…...

ELK分布式日志收集快速入门-(二)kafka进阶-快速安装可视化管理界面-(单节点部署)

目录安装前准备安装中安装成功安装前准备 安装kafka-参考博客 (10条消息) ELK分布式日志收集快速入门-&#xff08;一&#xff09;-kafka单体篇_康世行的博客-CSDN博客 安装zk 参考博客 (10条消息) 快速搭建-分布式远程调用框架搭建-dubbozookperspringboot demo 演示_康世行的…...

线程的创建

1. 多线程常用函数 1.1 创建一条新线程pthread_create 对此函数使用注意以下几点&#xff1a; 线程例程指的是&#xff1a;如果线程创建成功&#xff0c;则该线程会立即执行的函数。POSIX线程库的所有API对返回值的处理原则一致&#xff1a;成功返回0&#xff0c;失败返回错误…...

分布式之Paxos共识算法分析

写在前面 分布式共识是分布式系统中的重要内容&#xff0c;本文来一起看下&#xff0c;一种历史悠久&#xff08;1998由兰伯特提出&#xff0c;并助其获得2003年图灵奖&#xff09;的实现分布式共识的算法Paxos。Paxos主要分为两部分&#xff0c;Basic Paxos和Multi-Paxos,其中…...

35岁测试工程师,面临中年危机,我该如何自救...

被辞的原因 最近因故来了上海&#xff0c;联系上了一位许久不见的老朋友&#xff0c;老王&#xff1b;老王和我是大学同学&#xff0c;毕业之后他去了上海&#xff0c;我来到广州。因为我们大学专业关系&#xff0c;从12年毕业以后我们从事着相同的职业&#xff0c;软件自动化…...

时间轮算法概念

概述 在一些中间件中我们经常见到时间轮控制并发和熔断。 那么这个时间轮具体是什么呢&#xff0c;又是怎么使用的呢。 简介 其实时间轮可以简单的理解成我们日常生活中的时钟。 时钟里的指针一直在不停的转动&#xff0c;利用这个我们可以实现定时任务&#xff0c;目前lin…...

[SCTF2019]babyre 题解

对未来的真正慷慨&#xff0c;是把一切献给现在。 ——加缪 目录 1.查壳 2.处理花指令&#xff0c;找到main函数 这一操作过程可以参考下面的视频&#xff1a; 3.静态分析第一部分,psword1 4.静态分析第二部分,psword2 5.静态分析第五部分&#xff0c;psword3 6.根据ps…...

全志H3系统移植 | 移植主线最新uboot 2023.04和kernel 6.1.11到Nanopi NEO开发板

文章目录 环境说明uboot移植kernel移植rootfs移植测试环境说明 OS:Ubuntu 20.04.5 LTSGCC:arm-none-linux-gnueabihf-gcc 10.3.0编译器下载地址:Downloads | GNU-A Downloads – Arm Developer uboot移植 当前最新版本v2023.04-rc2下载地址:https://github.com/u-boot/u-…...

别只盯着显卡!CES上英伟达那个能装进口袋的AI超算,普通人怎么玩?

口袋里的AI革命&#xff1a;如何用英伟达Project DIGITS打造个人智能工作站 当大多数人还在讨论RTX 50系列显卡的游戏性能时&#xff0c;英伟达在CES 2025上悄悄展示了一个可能改变未来的小玩意——Project DIGITS。这个能装进口袋的AI超算&#xff0c;搭载GB10芯片&#xff0c…...

告别臃肿OS!手把手教你将Zephyr蓝牙协议栈移植到资源受限MCU(基于Polling轮询架构)

从零构建极简蓝牙协议栈&#xff1a;Zephyr Polling架构在资源受限MCU的实战指南 当智能手环的PCB面积被压缩到硬币大小&#xff0c;当电子价签需要依靠纽扣电池运行三年&#xff0c;传统蓝牙协议栈的"豪华配置"突然成了奢侈品。在深圳华强北的某个研发实验室里&…...

HPE DL380 Gen10安装RedHat 7.9全流程:从VROC驱动配置到系统引导避坑指南

HPE DL380 Gen10企业级部署实战&#xff1a;RedHat 7.9与VROC驱动深度适配指南 在企业级IT基础设施中&#xff0c;HPE ProLiant DL380 Gen10服务器以其卓越的可靠性和扩展性成为关键业务负载的首选平台。当这类高性能硬件遇上RedHat Enterprise Linux 7.9这一经典企业级操作系统…...

保姆级拆解:MIT-BEVFusion中Swin Transformer如何高效处理多相机图像(附代码逐行分析)

多相机BEV感知中的Swin Transformer实战&#xff1a;从原理到MIT-BEVFusion代码精要 在自动驾驶感知系统中&#xff0c;如何高效处理多相机输入并构建统一的鸟瞰视图&#xff08;BEV&#xff09;表征一直是核心挑战。本文将深入探讨Swin Transformer在多相机BEV感知中的创新应用…...

brpc编译优化:提升二进制执行效率的编译选项

brpc编译优化&#xff1a;提升二进制执行效率的编译选项 【免费下载链接】brpc brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation et…...

告别AI瞎编代码:手把手教你用Context7 MCP给Claude/Cursor装上“实时文档库”

告别AI幻觉代码&#xff1a;Context7 MCP与主流开发工具深度集成实战指南 每次看到AI助手生成那些无法运行的过时代码时&#xff0c;你是否也感到沮丧&#xff1f;作为深度依赖AI编程助手的开发者&#xff0c;我们都经历过这样的困境&#xff1a;花费数小时调试一段本不该出现的…...

基于Python的网上商城的设计与实现

目录 可选框架 可选语言 内容 可选框架 J2EE、MVC、vue3、spring、springmvc、mybatis、SSH、SpringBoot、SSM、django 可选语言 java、web、PHP、asp.net、javaweb、C#、python、 HTML5、jsp、ajax、vue3 内容 随着信息化时代的到来&#xff0c;电子商务变得家喻户晓&…...

C#搞CV别再跪了!OpenCVSharp的SIFT/SURF实现:我熬3夜踩5个坑,吐血整理保姆级代码

&#x1f32a;️ 一、先泼冰水&#xff1a;SIFT/SURF的“专利坟场”&#xff0c;别往里跳&#xff01;&#xff08;血泪预警&#xff09; ⚠️ 重点敲黑板&#xff1a; SURF已凉透&#xff1a;OpenCV 4.5.0 彻底移除&#xff01;别再搜“怎么用SURF”&#xff0c;纯属浪费生命&…...

避坑指南:STM32F411CEU6板载LED不亮的5个常见原因及解决方法

STM32F411CEU6板载LED故障排查实战手册 1. 硬件连接与基础检查 拿到一块STM32F411CEU6开发板&#xff08;俗称Black Pill&#xff09;&#xff0c;第一件事往往就是测试板载LED。但当你满怀期待地烧录程序后&#xff0c;发现LED毫无反应时&#xff0c;别急着怀疑人生。让我们从…...

工业协议通信开发实战:lib60870开源库完全指南

工业协议通信开发实战&#xff1a;lib60870开源库完全指南 【免费下载链接】lib60870 Official repository for lib60870 an implementation of the IEC 60870-5-101/104 protocol 项目地址: https://gitcode.com/gh_mirrors/li/lib60870 在工业自动化领域&#xff0c;设…...