在Java中實現遠端方法呼叫(轉)

BSDLite發表於2007-08-16
在Java中實現遠端方法呼叫(轉)[@more@]一、Java中的遠端方法呼叫

遠端方法呼叫(Remote Method Invocation, RMI)是Java1.1引入的分散式物件軟體包,它的出現簡化了在多臺機器上的Java應用之間的通訊。相比CORBA,RMI功能較弱且只能用於Java系統。

二、實現一個簡單的RMI

要使用RMI,必須構造四個主要的類:遠端物件的本地介面、RMI客戶、遠端物件實現和RMI伺服器。RMI伺服器生成遠端物件實現的一個例項,並用一個特殊的URL註冊它,RMI客戶在遠端伺服器上查詢物件,若找到就把它轉換成本地介面型別,然後像一個本地物件一樣使用它。下面是一個簡單的RMI例子,遠端物件只返回一個訊息字串。要使這個例子更有價值,我們需要做的就是完善遠端物件實現類。

1.遠端物件的本地介面類(Rem.java)

該類僅僅是一個介面,而不是實現,RMI客戶機可以直接使用它,RMI伺服器必須透過一個遠端物件來實現它,並用某個URL註冊它的一個例項。

import java.rmi.*;
public interface Rem extends Remote { public String getMessage() throws RemoteException;}


本地介面(Rem)必須是公共的,否則客戶機在載入一個實現該介面的遠端物件時就會出錯。此外,它還必須從java.rmi.Remote繼承而來,介面中的每一個方法都必須丟擲遠端異常java.rmi.RemoteException。

2.RMI客戶類(RemClient.java)

RMI客戶使用Naming.lookup在指定的遠端主機上查詢物件,若找到就把它轉換成本地介面Rem型別,然後像一個本地物件一樣使用它。與CORBA不同之處在於RMI客戶必須知道提供遠端服務主機的URL,這個URL可以透過rmi://host/path或rmi://host:port/path來指定,如果省略埠號,就使用1099。Naming.lookup可能產生三個異常:RemoteException、NotBoundException、MalformedURLException,三個尋常都需要捕獲。RemoteException、Naming和NotBoundException在java.rmi.*中定義,MalformedURLException在java.net.*中定義。另外,客戶機將向遠端物件傳遞序列化物件Serializable,所以還應在程式中輸入java.io.*。

import java.rmi.*;
import java.net.*;
import java.io.*;
public class RemClient {
public static void main(String[] args) {
try {
String host = (args.length > 0) ? args[0] : "localhost"; //從命令列讀取遠端主機名
//透過URL在遠端主機上查詢物件,並把它轉化為本地介面Rem型別
Rem remObject=(Rem)Naming.lookup("rmi://" + host + "/Rem");
System.out.println(remObject.getMessage()); //呼叫遠端物件的方法
} catch(RemoteException re) {System.out.println("RemoteException: " + re);
} catch(NotBoundException nbe) {System.out.println("NotBoundException: " + nbe);
} catch(MalformedURLException mfe){System.out.println("MalformedURLException:"+ mfe);
}}}
3.遠端物件實現類(RemImpl.java)
這個類真正實現RMI客戶呼叫的遠端物件,它必須從UnicastRemoteObject繼承,其建構函式應丟擲RemoteException異常。
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class RemImpl extends UnicastRemoteObject implements Rem {
public RemImpl() throws RemoteException {} //建構函式丟擲RemoteException異常
public String getMessage() throws RemoteException {
return("Here is a remote message."); }} //向RMI客戶返回一個訊息串 4.RMI伺服器類(RemServer.java)該類建立遠端物件實現RemImpl的一個例項,然後用一個特定的URL來註冊它,所謂註冊就是透過Naming.bind或Naming.rebind來將RemImpl例項繫結到URL上。 import java.rmi.*; import java.net.*; public class RemServer { public static void main(String[] args) { try { RemImpl localObject = new RemImpl(); //生成遠端物件實現的一個例項 Naming.rebind("rmi:///Rem", localObject); //將遠端物件例項繫結到rmi:///Rem上 }catch(RemoteException re){System.out.println("RemoteException:"+re); }catch(MalformedURLException mfe) {System.out.println("MalformedURLException: "+mfe); }}}

三、編譯和執行

編譯RMI客戶和伺服器,這將自動編譯遠端物件的本地介面和遠端物件實現
javac RemClient.java //自動編譯遠端物件的本地介面Rem.java
javac RemServer.java //自動編譯遠端物件實現RemImpl.java
生成客戶承接模組和伺服器框架
rmic RemImpl
這將構造RemImpl_Stub.class和RemImpl_Skeleton.class。請將Rem.class、RemClient.class和RemImpl_Stub.class複製到RMI客戶機,將Rem.class、RemImpl.class 、RemServer.class和RemImpl_Skeleton.class複製到RMI伺服器。
啟動RMI註冊
rmiregistry
//在伺服器上執行。不論有多少個遠端物件,本操作只需做一次
執行java RemServer.class
//啟動RMI伺服器(在伺服器上執行)
java RemClient.class
//啟動RMI客戶,將輸出“Here is a remote message.”

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-962335/,如需轉載,請註明出處,否則將追究法律責任。

相關文章