RMI(遠程方法調用)和CORBA(通用對象調用代理架構)是兩個最重要,並廣泛應用的分布對象系統架構。每個架構都有優劣,這兩個架構應用到從電子商務到醫保系統等不同的領域。兩者中任何一個被應用到項目中都不是很容易的工作。這篇文章大概介紹了RMI和CORBA,並演示了如何開發一個遠程下載文件的實例。 。介紹分布式對象系統 。介紹RMI和CORBA 。介紹一個RMI和CORBA的應用 。演示如何用RMI和CORBA從遠程主機傳輸文件 。比較CORBA和RMI C/S模式 客戶機/服務器模式是服務器和客戶機交換信息進行分布計算的一種模式。在這個模式裡,客戶機和服務器都用同一種語言—它們都理解的協議進行通信。 C/S模式有不同的開發方式,典型的應用是低層SOCKET開發。用SOCKET開發意味著我們必須設計一套協議,C/S雙方能相互通信的一系列命令集。一個例子就是HTTP協議,提供了一個GET方法,為了得到傳輸的文檔,C/S都必須實現。 分布式模式 基於系統的分布式對象是通過定義好的接口來隔離客戶端請求和服務器端服務的對象集。 數據請求和執行是分開的,這是C/S模式與分布式模式的主要區別。 在一個分布式模型裡,客戶端發送消息給一個對象,這個對象判斷消息決定哪種服務執行。 服務或者方法,SELECTION被對象或者代理來執行。RMI和CORBA就是這個模型的例子。 RMI RMI是能使你很容易地開發分布市對象的系統。RMI比SOCKETS開發容易地多,不需要定義協議。用RMI,開發者會認為調用本地類的本地方法,實際上是從遠程傳輸,翻譯,並把結果傳遞到本地。 RMI應用起步開發RMI,包括以下幾個步驟: 1 定義一個遠程接口 2 應用遠程接口 3 服務器端開發 4 客戶端開發 5 生成骨干代碼,啟動RMI注冊,服務器,客戶端 下面我們講述每一步的具體實現。 例子:文件傳輸應用 允許傳輸任何類型的文件到遠程主機。第一步定義描述方法的遠程接口。 定義遠程接口 代碼一是下載文件的遠程接口。接口FileInterface 提供了一個下載文件的方法,返回文件的字節集。 Code Sample 1: FileInterface.java import java.rmi.Remote; import java.rmi.RemoteException; public interface FileInterface extends Remote { public byte[] downloadFile(String fileName) throws RemoteException; } 注意: 為了客戶端能裝載包含遠程接口的遠程對象,接口必須定義為Public 必須擴展Remote接口,為了實現遠程對象 接口裡的每個方法必須拋出RemoteException異常 應用遠程接口下一步是實現接口FileInterface,一個簡單的應用在代碼二。 注意為了實現接口FileInterface,類FileImpl必須擴展UnicastRemoteObject。 這說明類FileImpl創建一個單一,不能復制的通過TCP傳輸的RMI對象, Code Sample 2: FileImpl.java import java.io.*; import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class FileImpl extends UnicastRemoteObject implements FileInterface { private String name; public FileImpl(String s) throws RemoteException{ super(); name = s; } public byte[] downloadFile(String fileName){ try { File file = new File(fileName); byte buffer[] = new byte[(int)file.length()]; BufferedInputStream input = new BufferedInputStream(new FileInputStream(fileName)); input.read(buffer,0,buffer.length); input.close(); return(buffer); } catch(Exception e){ System.out.println("FileImpl: "+e.getMessage()); e.printStackTrace(); return(null); } } } 服務器端開發 第三步是開發服務器端,有三個步驟: 1 創建RMISecurityManager實例並安裝它 2 創建一個遠程對象的實例 3 用RMI注冊對象。 Code Sample 3: FileServer.java import java.io.*; import java.rmi.*; public class FileServer { public static void main(String argv[]) { if(System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } try { FileInterface fi = new FileImpl("FileServer"); Naming.rebind("//127.0.0.1/FileServer", fi); } catch(Exception e) { System.out.println("FileServer: "+e.getMessage()); e.printStackTrace(); } } } 這句 Naming.rebind("//127.0.0.1/FileServer", fi) 說明RMI 注冊是運行在缺省端口1099。如果RMI注冊是在其它端口,此句應改為: Naming.rebind("//127.0.0.1:4500/FileServer", fi) 客戶端開發下一步就是開發客戶端。客戶端遠程調用遠程接口定義的任何方法。為了實現,客戶端必須先獲得RMI注冊的遠程對象的實例。一旦獲得,下載文件方法就別調用。如代碼4。這個應用中,客戶端接收兩個命令行參數。 Code Sample 4: FileClient.java import java.io.*; import java.rmi.*; public class FileClient{ public static void main(String argv[]) { if(argv.length != 2) { System.out.println("Usage: java FileClient fileName MachineName"); System.exit(0); } try { String name = "//" + argv[1] + "/FileServer"; FileInterface fi = (FileInterface) Naming.lookup(name); byte[] filedata = fi.downloadFile(argv[0]); File file = new File(argv[0]); BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file.getName())); output.write(filedata,0,filedata.length); output.flush(); output.close(); } catch(Exception e) { System.err.println("FileServer exception: "+ e.getMessage()); e.printStackTrace(); } } } 運行這個應用 為了運行這個應用,我們必須先生成骨干碼,然後編譯服務器端,客戶端代碼,RMI注冊,最後開始應用。 為了生成骨干碼,我們用RMIC命令: 命令行: rmic FileImpl 將生成兩個文件: FileImpl_Stub.class 和 FileImpl_Skel.class. 客戶端代理和服務端骨干。 下一步,編譯SERVER,CLIENT代碼 最後,開始RMI注冊,運行。 命令行> rmiregistry portNumber 注冊完成後,就可以開始服務器端應用。如果應用了RMI安全管理,你需要一個安全策略來處理。下面就是一個簡單的security policy: grant { permission java.security.AllPermission "", ""; }; 注意:這只是一個簡單的安全策略,如果比較重要的應用,你需要用更嚴格的安全策略。 拷貝所有的類除了客戶端類。確認安全策略在policy.txt後,用下面命令開始服務器端應用。 命令行> java -Djava.security.policy=policy.txt FileServer 為了在不同的機器開始客戶端應用,你需要拷貝 (FileInterface.class) 和(FileImpl_Stub.class). 命令行> Java FileClIEnt fileName MachineName 翻譯不當之處,請大家批評指正,謝謝! My mail:
[email protected]