1. Java RMI
Java Remote Method Invocation(Java远程方法调用)允许程序员创建分布式Java技术为基础的应用,可以调用不同JVM远程对象上的远程方法。RMI使用对象序列化去marshal(编码),unmarshal(解码)参数进行,不截断类型,支持面向对象的多态性。
2. Stub
RMI相当于一个代理模式。客户对象想要调用远程服务对象上的远程方法,我们需要一些辅助对象。这些辅助的对象使客户就像在调用本地对象的方法一样。客户对象调用客户辅助对象上的方法,仿佛客户辅助对象就是真正的服务。而客户辅助对象负责为我们转发这些请求,但是客户辅助对象不是真正的远程服务。虽然操作很像,但是不具有真正远程服务对象的方法逻辑。在服务端,服务辅助对象从客户辅助对象中接受请求,将调用的信息解包,然后调用真正服务对象上的真正方法。服务辅助对象从服务中得到返回值,将它打包,然后返回客户辅助对象,客户服务对象对信息解包,最后将返回值交给客户端。
Stub(存根)就相当于这里的客户辅助对象。存根将所需要的参数进行编码后传递给远程方法,并将调用结果或者异常传递给客户端。从JDK1.5开始,存根类可以采用动态代理的方式自动生成。在这之前,必须使用rmic工具手动创建。
3. java.rmi.Remote
3.1 扩展java.rmi.Remote接口
Remote是一个标记接口,没有任何方法,所有远程服务对象必须间接或者直接的扩展Remote接口。由于远程服务对象可以被其他的JVM调用,所有可以实现一个或多个远程接口。如果远程服务对象被同时的访问,必须在其实现中保证线程的安全。
public interface MyRemote extends java.rmi.Remote{}
3.2 接口声明中的所有方法都将抛出RemoteException异常。
客户调用远程接口的stub上的方法,而stub底层调用了网络和I/O,所以可能会发生各种异常,所以必须声明远程异常来解决。java.rmi.RemoteException继承自java.io.IOException。
public interface MyRemote extends Remote{
public String sayHello() throws RemoteException;
}
3.3 远程方法的变量和返回值必须是原语类型或者是可序列化类型。
这不难理解,因为远程方法的变量必须被打包并通过网络发送。(所以,在传送自己定义的类时,必须保证实现Serializable接口)
4. java.rmi.RemoteException
RemoteException继承自java.io.IOException。它是一个检查型异常,通常用来标识:通信失败、远程调用参数/返回值在编码(marshalling)/解码(unmarshalling)过程中出错,协议错误。
5. java.rmi.server.RemoteObject
RemoteObject类实现远程对象的java.lang.Object 行为,并提供了远程对象默认的hashCode、equals 和 toString 方法实现。创建远程对象并将其导出(使远程对象具有某些"远程的"功能)所需的方法由类UnicastRemoteObject 和 Activatable 提供。
6. java.rmi.registry.Registry
Registry是简单远程对象注册表的一个远程接口(默认的端口号为1099
),它提供绑定和查找的功能。其内部维护了一个名到对象的映射。LocateRegistry 用于获得对特定主机(包括本地主机)上引导远程对象注册表的引用,或用于创建一个接受对特定端口调用的远程对象注册表。 注意,getRegistry 调用并不实际生成到远程主机的连接。它只创建对远程注册表的本地引用,即便远程主机上没有正运行的注册表,它也会成功创建一个引用。LocateRegistry.createRegistry()方法在本机指定的端口上创建并发布一个registry远程对象。
7. 示例程序:
7.1 定义远程接口
public interface MyRemote extends Remote {
public String sayHello() throws RemoteException;
}
7.2 实现远程接口
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
private static final long serialVersionUID = -3510887331988311760L;
protected MyRemoteImpl() throws RemoteException {
} //这里必须抛出RemoteException异常,因为超类会抛出这个异常
@Override
public String sayHello() throws RemoteException {
return "server say hello to client";
}
}
7.3 用RMI Registry注册此服务
public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote{
private static final long serialVersionUID = -3510887331988311760L;
protected MyRemoteImpl() throws RemoteException {
}
@Override
public String sayHello() throws RemoteException {
return "server say hello to client";
}
public static void main(String[] args) {
try {
MyRemote remote = new MyRemoteImpl();
Naming.bind("myRemoteServer", remote);
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}
当注册这个实现对象时,RMI系统实际注册的是stub。
7.4 客户端定义
public class Client {
public static void main(String[] args) {
try {
MyRemote remote = (MyRemote)Naming.lookup("rmi://127.0.0.1/myRemoteServer");
System.out.println(remote.sayHello());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
启动:
1. 启动remiregistry服务(位于Java\jdk1.6.0_18\bin,启动的目录必须为你workspace的bin目录)
rmiregistry -J-Djava.rmi.server.codebase=file:/D:/FXworkspace/rmi/bin/
2. 执行MyRemoteImpl
3. 执行Client
结果输出:
server say hello to client
工作方式:
1)客户到RMI registry中寻找
2)RMI registry返回stub对象。
3)客户调用stub方法,就像stub是真正的服务对象一样。
注:rmic是JDK内的一个工具,用来为一个服务类产生stub和skeleton。rmic有一些选项可以调整,包括不要产生skeleton、查看源代码、甚至使用IIOP作为协议。
- 大小: 24.6 KB
- 大小: 19.2 KB
- 大小: 27.5 KB
分享到:
相关推荐
**基于JAVA RMI的聊天室** Java Remote Method Invocation(RMI)是Java平台提供的一种用于在分布式环境中调用远程对象的方法。在这个“基于JAVA RMI的聊天室”项目中,开发者利用RMI技术构建了一个简单的多用户...
1. **RMI概念**:RMI是一种基于对象的远程调用机制,它允许Java对象像调用本地方法一样调用远程对象的方法。RMI系统包括客户端和服务器两部分,客户端通过接口与服务器交互,服务器则提供具体实现。 2. **RMI架构**...
根据提供的文件信息,我们可以深入探讨Java RMI(Java Remote Method Invocation)的相关知识点,包括其概念、原理、体系结构以及一个具体的示例。 ### RMI的概念 RMI是一种Java技术,它允许开发者创建分布式应用...
1. 只支持Java:RMI是Java特有的,跨语言支持较差。 2. 性能限制:由于Java的序列化和反序列化过程,对于大数据量的传输可能效率较低。 3. 网络故障恢复:RMI没有内置的故障恢复机制,需要开发者自行处理。 通过这...
1. **环境准备**:确保Java环境和必要的库已安装,并了解目标RMI服务的地址和端口。 2. **运行工具**:使用命令行运行`attackRMI.jar`,并指定目标RMI服务器的相关参数。 3. **分析结果**:根据工具返回的信息,判断...
1. **创建远程接口**:首先,你需要定义一个Java接口,该接口声明了可以被远程调用的方法。这些方法必须是public并且没有void返回类型,因为RMI会异步调用它们。 2. **实现远程接口**:然后,创建一个实现远程接口...
### Java RMI (Remote Method Invocation) 概念与实践 #### 一、Java RMI简介 Java RMI(Remote Method Invocation)是一种允许调用不同Java虚拟机(JVM)上方法的机制。这些JVM可能位于不同的机器上,也可能在同一...
Java Remote Method Invocation(Java RMI)是Java编程语言中用于在网络间进行远程对象调用的技术。它是Java平台的标准部分,允许程序员在分布式环境中调用对象的方法,就像它们在同一台计算机上一样。Java RMI对于...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种分布式计算技术,它允许在不同网络节点上的Java对象之间进行透明的交互。在Java RMI中,一个对象可以调用另一个位于不同JVM(Java虚拟机)...
Java RMI(Remote Method Invocation)是Java编程语言中用于实现远程过程调用的一种技术。它允许运行在客户机上的程序调用位于远程服务器上的对象的方法,从而实现分布式计算。RMI的核心思想是通过接口隐藏底层网络...
1. **序列化**:Java RMI依赖于Java序列化机制来处理远程对象的传递。序列化是将对象的状态转换为字节流的过程,以便在网络上传输或存储在磁盘上。反序列化则是将字节流恢复成对象状态的过程。 2. **线程管理**:在...
1. **定义远程接口**:首先,你需要创建一个继承自`java.rmi.Remote`的接口,声明你想在远程对象上调用的方法。这些方法通常抛出`java.rmi.RemoteException`,因为网络通信中可能出现的各种问题。 2. **实现远程...
1. `IRemoteInterface.java`: 定义了远程接口,其中包含若干远程方法。 2. `RemoteObjectImpl.java`: 实现了`IRemoteInterface`,提供了远程方法的具体实现。 3. `Server.java`: 在服务器端启动,实例化`...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台提供的一种用于分布式计算的技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法。这个简单的示例展示了如何创建一个基本的...
1. 面向对象:RMI 可将完整的对象作为参数和返回值进行传递,而不仅仅是预定义的数据类型。 2. 可移动属性:RMI 可将属性(类实现程序)从客户机移动到服务器,或者从服务器移到客户机。 3. 安全:RMI 使用 Java ...
1. **远程对象(Remote Object)**:这是RMI的核心,它是一个实现了特定接口(继承自java.rmi.Remote)的对象,该接口中的方法声明抛出java.rmi.RemoteException。远程对象可以驻留在网络上的任何地方,并通过网络...
Java RMI(Remote Method Invocation,远程方法调用)是Java平台中用于构建分布式对象系统的关键技术。它允许Java应用程序在不同Java虚拟机(JVM)之间进行远程方法调用,这些虚拟机可能位于同一台计算机或网络上的...
1. **RMI基本概念**:理解RMI的核心在于远程接口(Remote Interface)和远程对象(Remote Object)。远程接口定义了可以在远程主机上执行的方法,而远程对象则是实现了这些接口的具体实例。 2. **注册与查找**:在...
1. **RMI基本概念**:RMI的核心是远程接口,它定义了可以在远程对象上执行的操作。通过实现远程接口,开发者可以创建远程对象,这些对象可以在网络中的其他地方被调用,就像它们是在本地一样。 2. **远程对象注册**...
1. **远程接口(Remote Interface)**:这是定义远程方法的接口,需要继承`java.rmi.Remote`。远程接口中的方法声明抛出`java.rmi.RemoteException`,表示这些方法可能在网络通信中出现异常。 2. **远程对象...