RMI(远程接口调用)
1. RMI的原理:
RMI系统结构,在客户端和服务器端都有几层结构。
方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
2. RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:
•远程服务的接口定义
•远程服务接口的具体实现
•桩(Stub)和框架(Skeleton)文件
•一个运行远程服务的服务器
•一个RMI命名服务,它允许客户端去发现这个远程服务
•类文件的提供者(一个HTTP或者FTP服务器)
•一个需要这个远程服务的客户端程序
3. RMI的实现
(1) 服务器端的实现
编写一个远程接口
(2) 编写远程接口的实现
(3) 编写服务器端程序
(4) 编写客户端程序
1. RMI的原理:
RMI系统结构,在客户端和服务器端都有几层结构。
方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。
2. RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:
•远程服务的接口定义
•远程服务接口的具体实现
•桩(Stub)和框架(Skeleton)文件
•一个运行远程服务的服务器
•一个RMI命名服务,它允许客户端去发现这个远程服务
•类文件的提供者(一个HTTP或者FTP服务器)
•一个需要这个远程服务的客户端程序
3. RMI的实现
(1) 服务器端的实现
编写一个远程接口
- package com.gjy.rmi.service;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- public interface AddServer extends Remote {
- public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException;
- }
package com.gjy.rmi.service; import java.rmi.Remote; import java.rmi.RemoteException; public interface AddServer extends Remote { public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException; }
(2) 编写远程接口的实现
- package com.gjy.rmi.service;
- import java.rmi.RemoteException;
- import java.rmi.server.UnicastRemoteObject;
- public class AddServerImpl extends UnicastRemoteObject implements AddServer {
- public AddServerImpl() throws RemoteException {
- super();
- }
- public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException {
- return firstnumber + secondnumber;
- }
- }
package com.gjy.rmi.service; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; public class AddServerImpl extends UnicastRemoteObject implements AddServer { public AddServerImpl() throws RemoteException { super(); } public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException { return firstnumber + secondnumber; } }
(3) 编写服务器端程序
- package com.gjy.rmi.service;
- import java.rmi.Naming;
- import java.rmi.registry.LocateRegistry;
- public class RmiServer {
- /**
- * 启动 RMI 注册服务并进行对象注册
- */
- public static void main(String[] argv)
- {
- try
- {
- //启动RMI注册服务,指定端口为1099 (1099为默认端口)
- //也可以通过命令 $java_home/bin/rmiregistry 1099启动
- //这里用这种方式避免了再打开一个DOS窗口
- //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个占位程序(stub类)为它所用
- LocateRegistry.createRegistry(1099);
- //创建远程对象的一个或多个实例,下面是hello对象
- //可以用不同名字注册不同的实例
- AddServer add = new AddServerImpl();
- //把hello注册到RMI注册服务器上,命名为Hello
- Naming.rebind("Hello", add);
- //如果要把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);
- }
- }
- }
package com.gjy.rmi.service; import java.rmi.Naming; import java.rmi.registry.LocateRegistry; public class RmiServer { /** * 启动 RMI 注册服务并进行对象注册 */ public static void main(String[] argv) { try { //启动RMI注册服务,指定端口为1099 (1099为默认端口) //也可以通过命令 $java_home/bin/rmiregistry 1099启动 //这里用这种方式避免了再打开一个DOS窗口 //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个占位程序(stub类)为它所用 LocateRegistry.createRegistry(1099); //创建远程对象的一个或多个实例,下面是hello对象 //可以用不同名字注册不同的实例 AddServer add = new AddServerImpl(); //把hello注册到RMI注册服务器上,命名为Hello Naming.rebind("Hello", add); //如果要把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) 编写客户端程序
- package com.gjy.rmi.client;
- import java.net.MalformedURLException;
- import java.rmi.Naming;
- import java.rmi.NotBoundException;
- import java.rmi.RemoteException;
- import com.gjy.rmi.service.AddServer;
- public class RmiClient {
- public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException {
- String url="rmi://127.0.0.1/Hello";
- AddServer add;
- add = (AddServer)Naming.lookup(url);
- int result=0;
- for (int i =0;i<10;i++){
- result = add.AddNumbers(10,i);
- System.out.println(result);
- }
- }
- }
package com.gjy.rmi.client; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import com.gjy.rmi.service.AddServer; public class RmiClient { public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException { String url="rmi://127.0.0.1/Hello"; AddServer add; add = (AddServer)Naming.lookup(url); int result=0; for (int i =0;i<10;i++){ result = add.AddNumbers(10,i); System.out.println(result); } } }
相关推荐
在"学术测试"这个示例代码中,你可能会找到以下组件: - 一个远程接口,定义了可被客户端调用的方法。 - 一个实现了该接口的远程对象类。 - 服务器端代码,创建远程对象实例并将其注册到RMI注册表。 - 客户端代码,...
以下是对RMI原理和实现的详细解释: 1. **RMI的基本概念**: - RMI是Java中的一个特性,允许对象在不同的网络节点之间进行交互,执行远程对象的方法。 - RMI调用对最终用户是透明的,意味着用户无需关心方法实际...
本项目提供的“java RMI实现代码”包括客户端和服务器端的示例,通过清晰的代码注释帮助理解RMI的工作原理。 一、RMI的基本概念 1. 远程接口:远程接口定义了客户端和服务器之间通信的API,它是Java接口,标注了`@...
这个压缩包“Java RMI-IIOP 相关源代码.rar”包含了相关的源代码示例,适合Java EJB(Enterprise JavaBeans)初学者进行学习和实践。 首先,Java RMI允许Java对象在不同的Java虚拟机之间进行远程调用,就像是本地...
"www.pudn.com.txt"可能是一个包含相关说明或者下载链接的文本文件,而"rmi"可能是包含具体RMI示例代码的文件夹。 在RMI的基本流程中: 1. **创建远程接口**:首先,你需要定义一个Java接口,该接口声明了可以被...
### 二、RMI代码示例解析 #### 1. 服务器端代码分析 在给定的部分内容中,可以看到一个静态块用于初始化远程方法`getMemberAccountCount`,这个方法将在客户端调用时使用。通过`Remote.class.getMethod()`获取该...
在`TestRMI`的压缩包中,可能包含了一个简单的RMI示例,包括服务器端和客户端的代码。服务器端代码会创建一个实现了远程接口的对象,并将其注册到RMI注册表。客户端代码则会查找并调用这个远程对象的方法。 服务器...
这个“RMI入门好例子”旨在帮助初学者理解并实践RMI的基本原理和操作流程。 首先,RMI的核心思想是通过接口实现远程对象的透明调用。在示例中,`rmidemo`可能包含了服务器端的代码,它会定义一个接口,例如`...
"www.pudn.com.txt"可能是一个链接或者资源列表,提供了更多关于RMI的参考资料,比如相关的文章、示例代码或者论坛讨论。这些资源通常会涵盖RMI的配置、安全设置、异常处理等方面,对于深化理解和实践RMI非常有帮助...
2. 示例程序:展示了RMI-IIOP的实际应用,包括客户端和服务端的代码示例,帮助初学者理解工作流程。 3. 集成文档:可能包含了如何将RMI与Spring框架整合的教程,指导开发者如何在Spring环境中使用RMI-IIOP实现服务的...
**RMI原理:** 1. **对象序列化**:RMI的核心在于将Java对象转换为字节流,以便在网络中传输。这个过程称为序列化。 2. **接口定义**:服务端定义一个远程接口,该接口包含可被远程调用的方法。客户端通过此接口与...
通过分析和运行"RMI-Java.rar"中的示例代码,你可以亲手体验RMI的工作流程,了解如何设置服务器、注册远程对象、创建客户端以及调用远程方法。这将帮助你更深入地掌握Java RMI技术,并能够在实际项目中灵活运用。
这个“一个RMI实例”显然是一个供初学者使用的示例项目,可以帮助理解RMI的基本原理和操作流程。 在RMI中,主要有以下几个核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它继承自java...
在这个"Java_RMI_ClientServer"示例中,我们将深入探讨RMI的工作原理及其关键组成部分。 1. **RMI的基本概念** - **接口**: 在RMI中,客户端和服务器通过接口进行通信。服务器端实现接口,并提供具体的方法实现,...
### 七、示例代码 1. 定义远程接口: ```java import java.rmi.Remote; import java.rmi.RemoteException; public interface MyRemoteInterface extends Remote { String hello(String name) throws ...
本示例中,"RMI 服务器与客户端源码"很可能是为了教学目的设计的,适合初学者了解RMI的基本工作原理和实践操作。 创建RMI服务器主要涉及以下步骤: 1. **定义远程接口**:远程接口是一个Java接口,其中声明了所有...
5. **详细文档**:为了帮助理解RMI的工作原理和配置,该实例还包含详细的文档,解释了如何设置RMI环境、如何处理异常、以及如何在不同操作系统和网络环境下运行。这些文档可能包括步骤指南、配置示例和常见问题解答...
综上所述,“RMI.rar_rmi”提供了一个简单的RMI应用示例,可以帮助学习者理解RMI的工作原理以及如何在实际项目中使用RMI进行分布式编程。通过分析和运行这个例子,你可以更深入地了解RMI的各个组成部分以及它们如何...
本示例将深入探讨RMI的基本概念、配置以及如何创建一个简单的客户端和服务端程序。 首先,我们需要理解RMI的核心组件: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它扩展了`java.rmi.Remote`...
Dubbo_ demo通常包含一系列示例代码,用于演示如何在项目中集成和使用Dubbo,帮助开发者快速理解和实践。 在分布式系统中,RPC机制扮演着至关重要的角色。RPC允许一个进程(客户端)调用另一个进程(服务端)的方法...