`
兩ting
  • 浏览: 78104 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

RMI原理流程及示例代码

阅读更多
RMI(远程接口调用)
1. RMI的原理:
RMI系统结构,在客户端和服务器端都有几层结构。

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

2. RMI(远程方法调用)的组成
一个正常工作的RMI系统由下面几个部分组成:

  •远程服务的接口定义
  •远程服务接口的具体实现
  •桩(Stub)和框架(Skeleton)文件
  •一个运行远程服务的服务器
  •一个RMI命名服务,它允许客户端去发现这个远程服务
  •类文件的提供者(一个HTTP或者FTP服务器)
      •一个需要这个远程服务的客户端程序



3. RMI的实现
(1) 服务器端的实现
编写一个远程接口
Java代码 复制代码 收藏代码
  1. package com.gjy.rmi.service;   
  2.   
  3. import java.rmi.Remote;   
  4. import java.rmi.RemoteException;   
  5.   
  6.   
  7. public interface AddServer extends Remote {    
  8.     public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException;    
  9. }  
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) 编写远程接口的实现
Java代码 复制代码 收藏代码
  1. package com.gjy.rmi.service;   
  2.   
  3. import java.rmi.RemoteException;   
  4. import java.rmi.server.UnicastRemoteObject;   
  5.   
  6. public class AddServerImpl extends UnicastRemoteObject implements AddServer {    
  7.     public AddServerImpl() throws RemoteException {    
  8.         super();    
  9.     }    
  10.     public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException {    
  11.         return firstnumber + secondnumber;    
  12.     }    
  13. }  
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) 编写服务器端程序
Java代码 复制代码 收藏代码
  1. package com.gjy.rmi.service;   
  2.   
  3. import java.rmi.Naming;   
  4. import java.rmi.registry.LocateRegistry;   
  5.   
  6. public class RmiServer {    
  7.      /**     
  8.         * 启动 RMI 注册服务并进行对象注册     
  9.         */      
  10.        public static void main(String[] argv)       
  11.        {       
  12.           try      
  13.           {       
  14.              //启动RMI注册服务,指定端口为1099 (1099为默认端口)       
  15.              //也可以通过命令 $java_home/bin/rmiregistry 1099启动       
  16.              //这里用这种方式避免了再打开一个DOS窗口       
  17.              //而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个占位程序(stub类)为它所用       
  18.              LocateRegistry.createRegistry(1099);       
  19.                    
  20.              //创建远程对象的一个或多个实例,下面是hello对象       
  21.              //可以用不同名字注册不同的实例       
  22.              AddServer add = new AddServerImpl();       
  23.                    
  24.              //把hello注册到RMI注册服务器上,命名为Hello       
  25.              Naming.rebind("Hello", add);       
  26.                     
  27.              //如果要把hello实例注册到另一台启动了RMI注册服务的机器上       
  28.              //Naming.rebind("//192.168.1.105:1099/Hello",hello);       
  29.                    
  30.              System.out.println("Hello Server is ready.");       
  31.           }       
  32.           catch (Exception e)       
  33.           {       
  34.              System.out.println("Hello Server failed: " + e);       
  35.           }       
  36.        }      
  37. }  
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) 编写客户端程序
Java代码 复制代码 收藏代码
  1. package com.gjy.rmi.client;   
  2.   
  3. import java.net.MalformedURLException;   
  4. import java.rmi.Naming;   
  5. import java.rmi.NotBoundException;   
  6. import java.rmi.RemoteException;   
  7.   
  8. import com.gjy.rmi.service.AddServer;   
  9.   
  10. public class RmiClient {    
  11. public static void main(String args[]) throws RemoteException, MalformedURLException, NotBoundException {    
  12.         String url="rmi://127.0.0.1/Hello";    
  13.         AddServer add;    
  14.         add = (AddServer)Naming.lookup(url);    
  15.         int result=0;   
  16.         for (int i =0;i<10;i++){   
  17.         result = add.AddNumbers(10,i);   
  18.         System.out.println(result);    
  19.         }   
  20.     }    
  21. }  
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注册表。 - 客户端代码,...

    RMI原理及实现,ppt格式

    以下是对RMI原理和实现的详细解释: 1. **RMI的基本概念**: - RMI是Java中的一个特性,允许对象在不同的网络节点之间进行交互,执行远程对象的方法。 - RMI调用对最终用户是透明的,意味着用户无需关心方法实际...

    java RMI实现代码

    本项目提供的“java RMI实现代码”包括客户端和服务器端的示例,通过清晰的代码注释帮助理解RMI的工作原理。 一、RMI的基本概念 1. 远程接口:远程接口定义了客户端和服务器之间通信的API,它是Java接口,标注了`@...

    Java RMI-IIOP 相关源代码.rar

    这个压缩包“Java RMI-IIOP 相关源代码.rar”包含了相关的源代码示例,适合Java EJB(Enterprise JavaBeans)初学者进行学习和实践。 首先,Java RMI允许Java对象在不同的Java虚拟机之间进行远程调用,就像是本地...

    java_rmi.rar_RMI java_java.rmi

    "www.pudn.com.txt"可能是一个包含相关说明或者下载链接的文本文件,而"rmi"可能是包含具体RMI示例代码的文件夹。 在RMI的基本流程中: 1. **创建远程接口**:首先,你需要定义一个Java接口,该接口声明了可以被...

    JAVA RMI远程调用方法代码

    ### 二、RMI代码示例解析 #### 1. 服务器端代码分析 在给定的部分内容中,可以看到一个静态块用于初始化远程方法`getMemberAccountCount`,这个方法将在客户端调用时使用。通过`Remote.class.getMethod()`获取该...

    RMI

    在`TestRMI`的压缩包中,可能包含了一个简单的RMI示例,包括服务器端和客户端的代码。服务器端代码会创建一个实现了远程接口的对象,并将其注册到RMI注册表。客户端代码则会查找并调用这个远程对象的方法。 服务器...

    RMI入门好例子

    这个“RMI入门好例子”旨在帮助初学者理解并实践RMI的基本原理和操作流程。 首先,RMI的核心思想是通过接口实现远程对象的透明调用。在示例中,`rmidemo`可能包含了服务器端的代码,它会定义一个接口,例如`...

    java_in_rmi.rar_Java RMI_RMI java_rmi _精通rmi

    "www.pudn.com.txt"可能是一个链接或者资源列表,提供了更多关于RMI的参考资料,比如相关的文章、示例代码或者论坛讨论。这些资源通常会涵盖RMI的配置、安全设置、异常处理等方面,对于深化理解和实践RMI非常有帮助...

    RMI-IIOP 基于SUN

    2. 示例程序:展示了RMI-IIOP的实际应用,包括客户端和服务端的代码示例,帮助初学者理解工作流程。 3. 集成文档:可能包含了如何将RMI与Spring框架整合的教程,指导开发者如何在Spring环境中使用RMI-IIOP实现服务的...

    RMI RMI-IIOP 客户端服务器交互

    **RMI原理:** 1. **对象序列化**:RMI的核心在于将Java对象转换为字节流,以便在网络中传输。这个过程称为序列化。 2. **接口定义**:服务端定义一个远程接口,该接口包含可被远程调用的方法。客户端通过此接口与...

    RMI-Java.rar_Java RMI

    通过分析和运行"RMI-Java.rar"中的示例代码,你可以亲手体验RMI的工作流程,了解如何设置服务器、注册远程对象、创建客户端以及调用远程方法。这将帮助你更深入地掌握Java RMI技术,并能够在实际项目中灵活运用。

    一个RMI实例

    这个“一个RMI实例”显然是一个供初学者使用的示例项目,可以帮助理解RMI的基本原理和操作流程。 在RMI中,主要有以下几个核心概念: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它继承自java...

    Java_RMI_ClientServer:RMI客户端-服务器示例

    在这个"Java_RMI_ClientServer"示例中,我们将深入探讨RMI的工作原理及其关键组成部分。 1. **RMI的基本概念** - **接口**: 在RMI中,客户端和服务器通过接口进行通信。服务器端实现接口,并提供具体的方法实现,...

    RMI demo

    ### 七、示例代码 1. 定义远程接口: ```java import java.rmi.Remote; import java.rmi.RemoteException; public interface MyRemoteInterface extends Remote { String hello(String name) throws ...

    RMI 服务器与客户端源码,很简单,自己做的,适合初学者

    本示例中,"RMI 服务器与客户端源码"很可能是为了教学目的设计的,适合初学者了解RMI的基本工作原理和实践操作。 创建RMI服务器主要涉及以下步骤: 1. **定义远程接口**:远程接口是一个Java接口,其中声明了所有...

    java rmi 简单易懂的实例

    5. **详细文档**:为了帮助理解RMI的工作原理和配置,该实例还包含详细的文档,解释了如何设置RMI环境、如何处理异常、以及如何在不同操作系统和网络环境下运行。这些文档可能包括步骤指南、配置示例和常见问题解答...

    RMI.rar_rmi

    综上所述,“RMI.rar_rmi”提供了一个简单的RMI应用示例,可以帮助学习者理解RMI的工作原理以及如何在实际项目中使用RMI进行分布式编程。通过分析和运行这个例子,你可以更深入地了解RMI的各个组成部分以及它们如何...

    rmi客户端和服务端例子程序

    本示例将深入探讨RMI的基本概念、配置以及如何创建一个简单的客户端和服务端程序。 首先,我们需要理解RMI的核心组件: 1. **远程接口(Remote Interface)**:这是定义远程方法的接口,它扩展了`java.rmi.Remote`...

    dubbo_ demo、角色_ RPC_原理 _RMI .zip

    Dubbo_ demo通常包含一系列示例代码,用于演示如何在项目中集成和使用Dubbo,帮助开发者快速理解和实践。 在分布式系统中,RPC机制扮演着至关重要的角色。RPC允许一个进程(客户端)调用另一个进程(服务端)的方法...

Global site tag (gtag.js) - Google Analytics