看到RMI,首先想到了这个问题,什么是RMI

Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。(从网上copy的,呵呵)

它与WEBSERVICE有什么区别。

rmi的客户端和服务端都必须是java,webservice没有这个限制

webservice是在http协议上传递xml文本文件,与语言和平台无关

rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言

RMI是EJB远程调用的基础,仅用RMI技术就可以实现远程调用,使用EJB是为了实现组件,事物,资源池,集群等功能。

WebService是通过XML来传输数据,可用http等协议因此可在异构系统间传递,并且可以穿过防火墙,可在公网上远程调用

不说了,提供小示例:

 

本文出自 “兄弟无间” 博客,请务必保留此出处http://llwbrothers.blog.51cto.com/2360705/537086

 

分为以下几个步骤:

1. 创建远程接口及声明远程方法(HelloInterface.java)
2. 实现远程接口及远程方法(继承UnicastRemoteObject)(Hello.java)
3. 启动RMI注册服务,并注册远程对象(HelloServer.java)
4. 客户端查找远程对象,并调用远程方法(HelloClient)
5. 执行程序:启动服务HelloServer;运行客户端HelloClient进行调用


package com.unmi;
import java.rmi.*;    
   
/**   
 * 远程接口必须扩展接口java.rmi.Remote   
 
*/   
public interface HelloInterface extends Remote    
{    
   /**   
    * 远程接口方法必须抛出 java.rmi.RemoteException   
    
*/   
   public String say() throws RemoteException;    
}

 

 

package com.unmi;
import java.rmi.*;    
import java.rmi.server.*;    
   
/**   
 * 扩展了UnicastRemoteObject类,并实现远程接口 HelloInterface   
 
*/   
public class Hello extends UnicastRemoteObject implements HelloInterface    
{    
   private String message;    
   
   /**   
    * 必须定义构造方法,即使是默认构造方法,也必须把它明确地写出来,因为它必须抛出出RemoteException异常   
    
*/   
   public Hello(String msg) throws RemoteException    
   {    
      message = msg;    
   }    
   
   /**   
    * 远程接口方法的实现   
    
*/   
   public String say() throws RemoteException    
   {    
      System.out.println("Called by HelloClient");    
      return message;    
   }    

 

 

package com.unmi;
import java.rmi.Naming;    
   
public class HelloClient    
{    
   /**   
    * 查找远程对象并调用远程方法   
    
*/   
   public static void main(String[] argv)    
   {    
      try   
      {    
         HelloInterface hello = (HelloInterface) Naming.lookup("Hello");    
             
         //如果要从另一台启动了RMI注册服务的机器上查找hello实例    
         
//HelloInterface hello = (HelloInterface)Naming.lookup("//192.168.1.105:1099/Hello");    
             
         
//调用远程方法    
         System.out.println(hello.say());    
      }    
      catch (Exception e)    
      {    
         System.out.println("HelloClient exception: " + e);    
      }    
   }    
}  

 

package com.unmi;
import java.rmi.Naming;    
import java.rmi.registry.LocateRegistry;    
   
public class HelloServer    
{    
   /**   
    * 启动 RMI 注册服务并进行对象注册   
    
*/   
   public static void main(String[] argv)    
   {    
      try   
      {    
         //启动RMI注册服务,指定端口为1099 (1099为默认端口)    
         
//也可以通过命令 $java_home/bin/rmiregistry 1099启动    
         
//这里用这种方式避免了再打开一个DOS窗口    
         
//而且用命令rmiregistry启动注册服务还必须事先用RMIC生成一个stub类为它所用    
         LocateRegistry.createRegistry(1099);    
            
        //创建远程对象的一个或多个实例,下面是hello对象    
         
//可以用不同名字注册不同的实例    
         HelloInterface hello = new Hello("Hello, world!");    
            
         //把hello注册到RMI注册服务器上,命名为Hello    
         Naming.rebind("Hello", hello);    
             
         //如果要把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);    
      }    
   }    
}  
posted on 2012-11-16 11:24  风生水起  阅读(6853)  评论(0编辑  收藏  举报