远程方法调用(Remote Method Invocation,RMI)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。
RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信,JRMP是专为Java的远程对象制定的协议。由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足,不能与用非Java语言书写的对象进行通信。
RMI/JNI和RMI/JDBC相结合,可帮助您利用RMI与目前使用非Java语言的现有服务器进行通信,而且在您需要时可扩展Java在这些服务器上的使用。
一、RMI运行原理
RMI应用程序通常包括两个独立的程序:服务器程序和客户机程序。典型的服务器应用程序将创建多个远程对象,使这些远程对象能够被引用,然后等待客户机调用这些远程对象的方法。而典型的客户机程序则从服务器中得到一个或多个远程对象的引用,然后调用远程对象的方法。RMI为服务器和客户机进行通信和信息传递提供了一种机制。
在与远程对象的通信过程中,RMI使用标准机制:stub和skeleton。远程对象的stub担当远程对象的客户本地代表或代理人角色。调用程序将调用本地stub的方法,而本地stub将负责执行对远程对象的方法调用。在远程虚拟机中,每个远程对象都可以有相应的skeleton(在JDK1.2环境中无需使用skeleton)。Skeleton负责将调用分配给实际的远程对象实现。stub和skeleton由rmic编译器生成。
在RMI分布式应用程序运行时,服务器调用注册服务程序以使名字与远程对象相关联。客户机在服务器上的注册服务程序中用远程对象的名字查找该远程对象,然后调用它的方法。
二、范例源码
1、远程传输对象
/**
* 远程传输的对象必须实现Serializable接口
*/
public class Person implements Serializable{
private String username;
private String password;
public Person(String username, String password){
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2、远程服务的接口定义
/**
* 远程服务的接口定义
*
* 该接口必须继承Remote,每个方法都必须抛出RemoteException异常对象
*/
public interface HelloWorld extends Remote {
public void say(String name) throws RemoteException;
public Person calculate(Person p) throws RemoteException;
}
3、远程服务接口的具体实现
/**
* 远程服务接口的具体实现
*
* 如果一个类继承自UnicastRemoteObject,那么它必须提供一个构造函数并且声明抛出一个RemoteException对象。
* 当这个构造函数调用了super(),它就激活UnicastRemoteObject中的代码完成RMI的连接和远程对象的初始化。
*/
public class HelloWorldImpl extends UnicastRemoteObject implements HelloWorld {
private static final long serialVersionUID = -8328854041003669643L;
//必须有一个显式的构造函数,并且要抛出RemoteException异常对象
public HelloWorldImpl() throws RemoteException{
super();
}
public void say(String name) throws RemoteException {
System.out.println("Hello " + name);
}
public Person calculate(Person p) throws RemoteException {
System.out.println(p.getUsername() + " _ " + p.getPassword());
p.setPassword("new pwd");
return p;
}
}
4、服务器程序
/**
* 服务器程序
*/
public class HelloWorldServer {
public HelloWorldServer(){
try{
HelloWorld obj = new HelloWorldImpl();
//Naming.rebind("rmi://localhost:1099/HelloWorldServer", obj);
//通过程序创建RMI注册服务,从而不需要执行rmiregistry命令
Registry reg = LocateRegistry.createRegistry(1099);
reg.rebind("HelloWorldServer", obj);
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
new HelloWorldServer();
}
}
5、客户端程序
/**
* 客户端程序
*/
public class HelloWorldClient {
public static void main(String[] args) {
try{
HelloWorld obj = (HelloWorld)Naming.lookup("rmi://localhost:1099/HelloWorldServer");
obj.say("chenjumin");
Person p = new Person("cjm", "123");
Person p2 = obj.calculate(p);
System.out.println(p2.getUsername() + " _ " + p2.getPassword());
}catch(MalformedURLException e){
e.printStackTrace();
}catch(RemoteException e){
e.printStackTrace();
}catch(NotBoundException e){
e.printStackTrace();
}
}
}
*6、用Ant命令生成桩(Stub)和框架(Skeleton)文件(自JDK1.5之后不再需要手工创建这两个文件,而由JDK通过代理机制动态生成)
<project name="rmiTask" basedir="." default="rmic">
<target name="rmic" >
<rmic classname="rmi.server.HelloWorldImpl" base="${basedir}/bin"/>
</target>
</project>
*7、启动RMI注册服务(注意:DOS命令必须在最顶层包路径所在的目录下执行)
DOS命令为:rmiregistry 1099
8、启动服务端程序
DOS命令为:java rmi.server.HelloWorldServer
9、启动客户端程序
DOS命令为:java rmi.server.HelloWorldClient
分享到:
相关推荐
这个“RMI入门好例子”旨在帮助初学者理解并实践RMI的基本原理和操作流程。 首先,RMI的核心思想是通过接口实现远程对象的透明调用。在示例中,`rmidemo`可能包含了服务器端的代码,它会定义一个接口,例如`...
自己收集了一些跑得通的教程,并自己整理给出了,入门例子。包括:最原生的使用javac和rmic的例子;还有进一步的,使用IDM,用代码代理原生rmic编译的例子;还有RMI和Spring整合的例子。 另外附有:例子说明 和 一些...
【JAVA RMI入门教程】 Java Remote Method Invocation (RMI) 是Java平台中用于构建分布式应用程序的一个关键技术。RMI使得不同Java虚拟机(JVM)之间的对象可以相互通信,从而共享资源和处理能力,实现分布式计算。其...
本项目提供了一个入门级的源代码示例,帮助开发者理解如何在 Spring 环境下集成 RMI 技术。以下是关于这两个技术及其整合的详细知识点: **Spring 框架** 1. **Spring 概述**:Spring 是一个开源的 Java 应用开发...
这篇博客“RMI入门小结”主要探讨了RMI的基础概念、实现步骤以及常见问题。 1. RMI的基本原理: RMI的核心是通过接口定义服务,服务端实现接口,并将实现类注册到RMI注册表中。客户端通过引用远程接口,即可调用...
这个"java RMI入门例子"将带你深入理解RMI的工作原理和主要组件。 RMI的核心概念包括: 1. **远程接口**:这是定义远程方法的接口,通常继承自java.rmi.Remote。这些方法声明抛出java.rmi.RemoteException,表示...
简约而不简单的描述了RMI技术,希望对大家有所帮助。
### RMI基础知识与实践 #### 一、Java RMI简介 Java Remote Method Invocation (RMI) 是Java平台提供的一种分布式计算技术,允许开发者在不同Java虚拟机(JVM)之间调用远程对象的方法,从而实现分布式应用程序的...
RMI(Remote Method Invocation)是Java提供的一种用于构建分布式应用程序的机制,它允许Java对象在不同的网络环境中相互调用方法,实现了远程对象间的无缝通信。RMI是在JDK1.1版本中引入的,它是纯Java实现的,遵循...
《EJB-RMI入门》是一本专注于讲解Java企业级应用开发技术的书籍,特别是针对RMI(Remote Method Invocation,远程方法调用)的使用。RMI是Java平台中用于构建分布式应用程序的关键技术,它允许Java对象在不同的Java...
这个“rmi入门(带源码)”的资源可能是一个教学资料或实践项目,帮助初学者理解和应用RMI技术。 首先,我们来详细了解一下RMI的基本概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口。它继承了...
【标题】:“RMI入门” 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种用于在分布式环境中实现对象间通信的技术。RMI允许一个Java对象调用网络另一端的Java对象的方法,就像调用本地对象...
RMI,远程方法调用(Remote Method Invocation)是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。RMI是非常容易使用的,但是它非常的强大。
Java Remote Method Invocation(Java RMI)是Java编程语言中用于在网络间进行远程对象调用的技术。它是Java平台的标准部分,允许程序员在分布式环境中调用对象的方法,就像它们在同一台计算机上一样。Java RMI对于...
在本文中,我们将深入探讨Java Remote Method Invocation (RMI)技术,通过一个具体的实例来学习如何设置、构建和调试RMI应用。RMI是Java提供的一种远程对象调用机制,它允许Java对象在不同的JVM之间进行通信。在这个...
本文档是关于Java远程方法调用(Java RMI)的入门教程,适用于JDK 1.1版本。文档首次发布于1997年2月10日,由Sun Microsystems公司版权所有。Sun Microsystems公司授予用户一个全球性的、非独家的、不可转让的、无...
**零基础入门RMI:** 1. **理解基本概念:** - **远程对象(Remote Object)**:这是在远程主机上运行的Java对象,可以通过网络被其他客户端访问。 - **接口(Interface)**:定义远程对象的方法,这个接口需要...
RMI 用法入门.mht