1.分布式应用程序需要?
(1)查找远程对象。
(2)通过远程对象通信
(3)调入被当作参数或返回值的对象的类的字节码
2.java分布式对象模型中的术语?
(1)remote object:指这个对象的方法可以被另一个JRE调用,潜在的含义是JRE不在同一主机上。
(2)remote method invocation(RMI):在remote object中调用remote interface中规定方法的动作。
3.用户定义remote interface的要求?
(1)必须直接或间接继承java.rmi.Remote接口。
例外情况:可以继承non-remote interface。
public interface Alpha{
public void test() throws java.rmi.RemoteException;
}
public interface beta extends Alpha, Remote{
}
(2)声明在remote或者父接口中的方法发须满足以下要求:
<1>声明的方法必须抛出java.rmi.RemoteException,或该异常的父类,例如:java.io.IOException,java.lang.Exception。也可以抛出用户自定义异常,但是该异常必须继承java.rmi.RemoteException。
<2>声明方法中被声明为参数或返回值必须是一个接口类型,而不是接口的实现类。
4.实现remote interface?
(1)该类通常继承java.rmi.server.UnicastRemoteObject,因此也会继承java.rmi.server.RemoteObject,java.rmi.server.RemoteServer。
(2)该类可以实现多个remote interface
(3)该类可以继承另一个remote interface实现类
(4)该类可以定义remote interface中未提供的方法,但是这些方法是只能本地来用而不能用来做远程调用的方法。
5.RMI中传递的参数?
参数或返回值可以是实现serializable的任意对象。例如:简单类型,远程对象,实现java.io.Serializable接口的对象。
(1)传递non-remote对象
调用的jre,是传递过来的对象副本,创建一个新的对象。
(2)传递remote对象
传递的是remote对象的存根
(3)引用完整性
当一个对象的两个应用同时传递到另一个JRE,RMI系统维护引用完整性。
(4)类注释
RMI系统为类描述在调用流中用类的信息(例如:URL)来做注释,以便类可以在接收放被调用。
(5)参数传递
在远程方法调用中的参数是被写入到一个流,这个流是ObjectOutputStream的子类,用来序列化远程方法调用中定义的参数。ObjectOutputStream的子类重载replaceObject()方法,用输出的远程对象的通讯桩实例来替换远程对象。对象参数是被写入到流通过ObjectOutputStream的writeObject()方法。ObjectOutputStream为个对象先调用replaceObject,再经由writeObject方法将其写入到流。
6.ObjectOutputStream的RMI子类中的replaceObject返回?
(1)如果对象是java.rmi.Remote对象实例且是被输出在RMI运行时,返回远程对象的桩。如果对象是java.rmi.Remote对象实例且不是被RMI运行时输出,返回远程本身。远程对象桩,可以通过java.rmi.server.RemoteObject.toStub()方法。
(2)如果不是java.rmi.Remote对象,则被简单的返回。
7.Stubs(桩) and Skeletons(骨架)?
RMI在远程对象间使用标准通信机制(RPC也采用)stubs和skeletons。
(1)远程对象的stub?
可以看作是远程对象的本地代表或代理。调用者调用local stub的方法,stub负责完成远程对象的调用。
(2)stub的方法被调用后?
<1>初始化于包含远程对象的虚拟机的连接
<2>整理(写或传递)远程对象的参数
<3>等待方法返回的结果
<4>整理(读)返回值或返回的表达式
<5>向调用者返回值
(3)skeleton?
负责分发调用到实际的远程对象实现上。在Java2 platform,skeleton可以没有。
(4)skeleton接收到方法调用后?
<1>整理(读)远程方法的参数
<2>调用远程对象实现的方法
<3>整理(写或传递)返回结果给调用者
注:stub和skeleton是由rmic编译生成。
8.java.rmi.Naming?
<1>每个方法都有一个公共的参数,该参数是一个String类型的URL,格式为://host(default host:localhost):port(default port:1099)/name
9.java.rmi.server.UnicastRemoteObject?
(1)如果远程对象是用UnicastRemoteObject.exportObject(Remote)方法输出,被调用的stub class(由rmic工具生成)实例是由以下顺序生成。
<1>确定根类
1)远程对象类直接实现了扩展remote接口的接口
2)如果远程对象的父类,实现了扩展remote接口的接口的类,则是根类;否则,依次向上查找
<2>被载入的stub的名字是,根类加上"_Stub"后缀。
<3>stub class根据名字被载入使用根类的class loader。stub class必须继承RemoteStub,必须有一个公共的构造函数,该函数接收一个RemoteRef类型的参数。
<4>stub实例用RemoteRef来构造。
(2)输出remote object另外的方式?
<1>如果远程对象的stub载入失败或java.rmi.server.ignoreStubClasses是被设置为true。代理是被以下发生构造。
1)代理是被remote object类的class loader定义。
2)代理实现remote object类实际的所有的接口。
3)代理调用处理器是一个RemoteRef构建的RemoteObjectInvocationHandler实例。
4)如果代理不能创建,则抛出StubNotFoundException异常。
(3)UnicastRemoteObject实现了包含以下特征的远程服务对象
<1>远程对象通过TCP transport通讯。
<2>客户端和服务器端之间通过stream protocol通信,调用、方法、返回值。
例子:
远程对象接口文件
RmiHelloRemoteInterface.java
import java.rmi.*;
public interface RmiHelloRemoteInterface extends Remote{
public String helloRemoteObj(String client) throws RemoteException;
}
远程对象文件
RmiHelloRemoteObject.java
import java.rmi.server.*;
import java.rmi.*;
public class RmiHelloRemoteObject extends UnicastRemoteObject implements RmiHelloRemoteInterface{
public RmiHelloRemoteObject() throws RemoteException{
super();
}
public String helloRemoteObj(String client) throws RemoteException{
return "Hello world, " + client;
}
}
服务端程序
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
import sun.applet.*;
import java.rmi.registry.LocateRegistry;
public class RmiHelloServer{
public RmiHelloServer(){
}
public static void main(String[] args){
//创建并安装安全管理
if(System.getSecurityManager() == null){
System.setSecurityManager(new RMISecurityManager());
}
try{
//创建远程对象
RmiHelloRemoteObject obj = new RmiHelloRemoteObject();
//启动注册表
LocateRegistry.createRegistry(3000);
//将名称绑定到对象
Naming.bind("//localhost:3000/helloObj", obj);
System.out.println("RMI服务器正在运行... ...");
}catch(Exception e){
e.printStackTrace();
}
}
}//客户端程序
import java.rmi.*;
import java.rmi.server.*;
public class RmiHelloClient{
public RmiHelloClient(){
}
public static void main(String[] args){
//创建并安装安全管理器
if(System.getSecurityManager() == null){
System.setSecurityManager(new RMISecurityManager());
}
try{
RmiHelloRemoteInterface client = (RmiHelloRemoteInterface)Naming.lookup("rmi://localhost:3000/helloObj");
System.out.println(client.helloRemoteObj("everyone!"));
}catch(Exception e){
e.printStackTrace();
}
System.exit(0);
}
}
//安全管理文件
//将以下信息创建一个文件,文件名任取,运行服务端和客户时,要用到,用于授权。
//grant codeBase "file:/D:/test_ws/RMI/" {permission java.net.SocketPermission "*:1000-9999", "accept, connect, listen, resolve";};
执行程序
(1)编译以上文件
(2)通过rmic创建stub rmic RmiHelloRemoteObject
(3)运行java -Djava.security.policy=test.policy RmiHelloServer
(4)运行java -Djava.security.policy=test.policy RmiHelloClient
分享到:
相关推荐
Java RMI实例
这个“一个RMI实例”显然是一个供初学者使用的示例项目,可以帮助理解RMI的基本原理和操作流程。 在RMI中,主要有以下几个核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它继承自java...
通过学习和实践这个RMI例子,我们可以深入理解Java的分布式编程能力,这对于开发大型企业级应用或者分布式系统来说是非常有价值的。同时,了解RMI的工作原理也有助于我们更好地掌握其他类似技术,如JDBC、JNDI等。
通过DWR和RMI的实例操作,我们可以构建出一个具有动态交互特性的Web应用,其中DWR负责前端与后端的异步通信,而RMI则处理后台的分布式计算和数据交换。这两个技术的结合可以为复杂的Web应用提供高效且灵活的解决方案...
下面将详细阐述RMI的实例及其用法。 **1. RMI的基本概念** RMI的核心理念是对象的远程调用,它通过序列化和反序列化机制,将远程对象的方法调用转化为网络通信。在RMI中,主要有三个关键角色:远程接口(Remote ...
这个"一个简单的RMI例子Java源代码"是为了帮助开发者更好地理解和应用RMI。 RMI的核心概念包括: 1. **远程接口(Remote Interface)**:这是定义远程方法的Java接口。它声明了客户端可以调用的那些方法,这些方法...
中间件实验(RMI 实例)是 Java RMI(Remote Method Invocation,远程方法调用)的实验报告,旨在通过实验了解 Java RMI 的机制和开发流程。本实验报告主要介绍了 RMI 的基本概念、实验步骤、实验结果和结论分析等...
### 简单RMI例子 这个例子的代码可能包括以下部分: 1. **定义远程接口**: ```java public interface MyRemoteInterface extends Remote { String doSomething(String input) throws RemoteException; } ``` 2....
在Java RMI实例中,我们通常会经历以下几个步骤: 1. **创建远程接口**:首先,我们需要定义一个远程接口,这个接口需要扩展`java.rmi.Remote`。远程接口中的所有方法都需要抛出`RemoteException`,这是因为远程...
这个简单的RMI实例可能是为了帮助初学者理解RMI的基本工作原理和实现步骤。 RMI的核心概念是客户端和服务端。服务端通过RMI注册一个远程接口,该接口定义了可供客户端调用的方法。客户端则通过RMI机制获取到服务端...
这个“简单的RMI实例”演示了如何在不依赖像Tomcat这样的Web服务器的情况下实现RMI。下面我们将深入探讨RMI的基本概念、配置过程以及如何创建和运行这个实例。 ### RMI基本概念 1. **远程对象(Remote Object)**:...
### Java分布式之RMI实例教程知识点详解 #### 一、RMI基础知识介绍 **RMI (Remote Method Invocation)** 是一种Java技术,用于实现分布式应用程序之间的远程过程调用。通过RMI,开发者可以在不同的JVM之间调用方法...
本实例将引导我们理解RMI的基本概念和实现步骤。 RMI的核心是提供一种跨网络的分布式计算能力,使得一台计算机上的程序能够像调用本地对象一样调用另一台计算机上的对象。这在多层架构的应用中尤其有用,比如服务器...
【RMI实例详解】 远程方法调用(RMI,Remote Method Invocation)是Java JDK 1.1引入的一种分布式对象技术,旨在简化分布在不同环境下的Java应用程序间的通信。RMI允许对象在不同的Java虚拟机(JVM)之间进行交互,...
JAVA分布式之RMI实例教程网络通信原理[收集].pdf
**标题:“RMI实例(Spring整合)”** 远程方法调用(Remote Method Invocation,简称RMI)是Java中的一种机制,允许一个Java对象在某个Java虚拟机(JVM)上执行另一个Java对象的方法,即使该对象位于不同的网络...
在Web应用实例中,RMI可以作为服务层和表现层之间的通信机制。例如,`rimserver`可能是一个部署在Web服务器上的Java应用,提供RMI服务,而`rmiclient`则是一个调用这些服务的客户端应用。客户端可能是一个Web页面,...
在这个"分布式调用RMI例子程序"中,我们主要关注的是如何使用RMI技术来创建和运行一个简单的分布式应用。 RMI的核心概念包括远程接口、远程对象和RMI注册表。首先,远程接口定义了可以在远程服务器上执行的方法,...