RMI代碼示例


看到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);    
      }    
   }    
}  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM