JAVA-RMI使用快速入门

c#小王子 c#小王子 2021-11-16 986 Java


JAVA-RMI使用快速入门


一.RMI 原理及介绍


1.基本介绍


RMI 目前使用 Java 远程消息交 换协议 JRMP(Java Remote Messaging Protocol)进行通信。JRMP 是专为 Java 的远程对象制定的协议。因此,Java RMI 具有 Java 的“Write Once,RunAnywhere”的优点,是分布式应用系统的百分之百纯 Java 解决方案。用 Java RMI 开发的应用系统可以部署在任何支持 JRE(Java Run Environment Java,运行环境)的平台上。但由于 JRMP 是专为 Java 对象制定的,因此,RMI 对于用非 Java 语言开发的应用系统的支持不足。不能与用非 Java 语言书写的对象进行通信。


Java Remote Method Invocation ( RMI -- Java 远程方法调用)允许您使用 Java 编写分布式对象。本文将介绍 RMI 的优点以及如何将其连接到现有的和原有的系统中,以及与用 Java 编写的组件的连接。


RMI 为采用 Java 对象的分布式计算提供了简单而直接的途径。这些对象可以是新的 Java 对象,也可以是围绕现有 API 的简单的 Java 包装程序。Java 体现了“编写一次就能在任何地方运行的模式。而 RMI 可将 Java 模式进行扩展,使之可在任何地方运行”。因为 RMI 是以 Java为核心的,所以,它将 Java 的安全性和可移植性等强大功能带给了分布式计算。务逻辑等属性移动到网络中最合适的地方。如果您要扩展 Java 在系统中的使用,RMI 将使您充分利用其强大功能。


RMI 可利用标准 Java 本机方法接口 JNI 与现有的和原有的系统相连接。RMI 还可利用标准JDBC 包与现有的关系数据库连接。RMI/JNI 和 RMI/JDBC 相结合,可帮助您利用 RMI 与目前使用非 Java 语言的现有服务器进行通信,而且在您需要时可扩展 Java 在这些服务器上的使用。RMI 可帮助您在扩展使用时充分利用 Java 的强大功能。


2.基本组成


一个正常工作的 RMI 系统由下面几个部分组成:

1)远程服务的接口定义

2)远程服务接口的具体实现

3)桩(Stub)和框架(Skeleton)文件

4)一个运行远程服务的服务器

5)一个 RMI 命名服务,它允许客户端去发现这个远程服务

6)类文件的提供者(一个 HTTP 或者 FTP 服务器)

7)一个需要这个远程服务的客户端程序


3.原理

RMI 系统结构,在客户端和服务器端都有几层结构。

--------- ----------

| 客户 | | 服务器|

---------- ----------

| |

------------- ----------

| 占位程序 | | 骨干------------------| 远程引用层 |

------------------------------------

| |

------------------------------------

| 传输层 |

------------------------------------

方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机, 然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服 务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。


要完成以上步骤需要有以下几个步骤:

1)生成一个远程接口

2)实现远程对象(服务器端程序)

3)生成占位程序和骨干网(服务器端程序)

4)编写服务器程序

5)编写客户程序

6)注册远程对象

7)启动远程对象


二.RMI 在 spring 环境下使用


1. 首先导入各种 spring 的 jar 包(打钩的一定要有的)


2. 编写接口以及实现类


public interface ICalculator {
public long add(long a, long b);
public long sub(long a, long b);
public long mul(long a, long b);
public long div(long a, long b);
}//参数必须是可序列化的参数实现 java.io.Serializable
public class CalculatorImp implements ICalculator {}


3. 配置 spring 文件


服务端:


<bean id="CalculatorServcie" class="cn.com.starit.test.server.imp.CalculatorImp">
</bean> 
<bean id="serviceExporter" class="org.springframework.remoting.rmi.RmiServiceExporter"><property name="service" ref="CalculatorServcie" /><!-- 服务-->
<property name="serviceName" value="calculatorServcie" /><!-- 服务名称 -->
<property name="serviceInterface" value="cn.com.starit.test.server.ICalculator" /><!--接口
-->
<property name="registryPort" value="1099" /><!-- 注册端口 -->
</bean>


客户端:


<bean id="someServiceProxy" class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> 
<property name="serviceUrl" value="rmi://192.168.100.105:1099/calculatorServcie"/>
<property name="serviceInterface" value="cn.com.starit.test.server.ICalculator"/>
</bean>


4. 服务端启动会在 web 服务器启动的时候启动


如果不是 web 服务器,则需要线程进行启动。

ApplicationContext context = new
ClassPathXmlApplicationContext("context/RmiServiceContext.xml");
System.out.println("RMI starting ok.....");


5. 客户端调用


获取服务端 bean 并强转为相应的接口就可以使用了


ApplicationContext context = new ClassPathXmlApplicationContext("context/RmiStubContext.xml");
ICalculator stub = (ICalculator) context.getBean("someServiceProxy");
stub.add(100,20);


三.不在 spring 中使用 RMI


分为以下四个步骤

1. 创建远程接口及声明远程方法(HelloInterface.java)

2. 实现远程接口及远程方法(继承 UnicastRemoteObject)(Hello.java)

3. 启动 RMI 注册服务,并注册远程对象(HelloServer.java)

4. 客户端查找远程对象,并调用远程方法(HelloClient)

5. 执行程序:启动服务 HelloServer;运行客户端 HelloClient 进行调用具体代码及对应步骤如下:


1) 创建远程接口及声明远程方法(HelloInterface.java)


java 代码
package com.unmi;
import java.rmi.*;
/**
* 远程接口必须扩展接口java.rmi.Remote
*/
public interface HelloInterface extends Remote
{/**
* 远程接口方法必须抛出 java.rmi.RemoteException
*/
public String say() throws RemoteException;
}


2) 实现远程接口及远程方法(继承 UnicastRemoteObject)Hello.java如果传递参数,参数必须是可序列化的参数实现 java.io.Serializable

java 代码


package com.unmi;
import java.rmi.*;
import java.rmi.server.*;
/**
* 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface
*/
public class Hello extends UnicastRemoteObject implements HelloInterface
{
private String message;
/**
* 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛
出出RemoteException异常
*/
public Hello(String msg) throws RemoteException
{
message = msg;
}
/**
* 远程接口方法的实现
*/
public String say() throws RemoteException
{
System.out.println("Called by HelloClient");
return message;
} 
}


3) 启动 RMI 注册服务,并注册远程对象(HelloServer.java)


java 代码


package com.unmi;
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class HelloServer
{
/**
* 启动 RMI 注册服务并进行对象注册
*/public static void main(String[] argv)
{
try
{
//启动RMI注册服务,指定端口为1099 
(1099为默认端口)
//也可以通过命令 $java_home/bin/rmiregistry 1099启动
//这里用这种方式避免了再打开一个DOS窗口
//而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所
用
LocateRegistry.createRegistry(1099);
//创建远程对象的一个或多个实例,下面是hello对象
//可以用不同名字注册不同的实例
HelloInterface hello = new Hello("Hello, world!");
//把hello注册到RMI注册服务器上,命名为Hello
Naming.rebind("Hello", hello);
//如果要把hello实例注册到另一台启动了RMI注册服务的机器上
//Naming.rebind("//192.168.1.105:1099/Hello",hello);
System.out.println("Hello Server is ready.");
}
catch (Exception e)
{
System.out.println("Hello Server failed: " + e);
} 
} 
}


4) 客户端查找远程对象,并调用远程方法(HelloClient)


java 代码


package com.unmi;
import java.rmi.Naming;
public class HelloClient
{
/**
* 查找远程对象并调用远程方法
*/
public static void main(String[] argv){
try{
HelloInterface hello = (HelloInterface) Naming.lookup("Hello");
//如果要从另一台启动了RMI注册服务的机器上查找hello实例
//HelloInterface hello =
(HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");
//调用远程方法
System.out.println(hello.say());
}
catch (Exception e){
System.out.println("HelloClient exception: " + e);
} 
} 
}

【下载地址】

百度网盘链接:https://pan.baidu.com/s/1HRHv9xY78DPCj2y8g2ChEQ

提取码:pbsg


相关文章


使用-JFreeChart来创建基于web的图表

使用-JFreeChart来创建基于web的图表

XStream使用文档

XStream使用文档

WebService发布过程及常见问题

WebService发布过程及常见问题

webpack实战入门进阶调优分享

webpack实战入门进阶调优分享

weblogic调优参数及监控指标

weblogic调优参数及监控指标

weblogic节点管理

weblogic节点管理

weblogic管理控制台概述

weblogic管理控制台概述

weblogic-部署和启动

weblogic-部署和启动

WebLogic-Server-性能及调优-调优-Java-虚拟机

Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。

Velocity用户教程

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

Velocity用户手册

Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。


文章热度: 166291
文章数量: 333
推荐阅读

FlashFXP绿色版网盘下载,附激活教程 1781

FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具

Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1565

firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ

navicat for mysql中文绿色版网盘下载 1623

Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq

火车头采集器(旗舰版)绿色版网盘下载 1707

火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA

Photoshop(CS-2015-2023)绿色中文版软件下载 1823

安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64

知之

知之平台是全球领先的知识付费平台。提供各个领域的项目实战经验分享,提供优质的行业解决方案信息,来帮助您的工作和学习

使用指南 建议意见 用户协议 友情链接 隐私政策 Powered by NOOU ©2020 知之