国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

RMI在企業(yè)分布式計(jì)算中的應(yīng)用

2019-11-18 12:41:51
字體:
供稿:網(wǎng)友

  作為整個(gè)產(chǎn)品供給鏈中的一部分,現(xiàn)代企業(yè)的企業(yè)信息資源廣泛分布在各種網(wǎng)絡(luò)體系中,企業(yè)必須能夠處理這些分布的信息資源,這使得分布式企業(yè)應(yīng)用成為構(gòu)建企業(yè)信息環(huán)境的必然需求。RMI是使用最廣泛的分布式對象系統(tǒng)之一,本文舉例介紹了分布式企業(yè)計(jì)算的基本模式及如何應(yīng)用RMI 來開發(fā)分布式的企業(yè)應(yīng)用。
  
  一、客戶/服務(wù)端模式
  客戶/服務(wù)模式通過使用一個(gè)應(yīng)用程序(客戶)和另一個(gè)程序(服務(wù)端)交換數(shù)據(jù)。在客戶/服務(wù)模式的應(yīng)用中,通常使用低層次的Socket來開發(fā),使用Socket來開發(fā)客戶/服務(wù)端模式意味著我們必須自己設(shè)計(jì)一種包含客戶端和服務(wù)端都統(tǒng)一的命令集的協(xié)議,使得客戶端和服務(wù)端能夠通過這個(gè)協(xié)議來通信。
  
  二、分布式對象模式
  分布式對象系統(tǒng)是一個(gè)對象集合,通過定義很完善的統(tǒng)一接口來分隔開請求服務(wù)(客戶端)和功能服務(wù)(服務(wù)端)。在分布式對象模式里,客戶端發(fā)送一個(gè)消息到一個(gè)對象,由對象解釋這個(gè)消息,然后決定應(yīng)該由什么服務(wù)來完成,這個(gè)服務(wù)、方法或選擇可能是被一個(gè)對象或是被一個(gè)Broker來完成的。
  
  三、RMI
  RMI是一個(gè)分布式對象模式。由于不需要設(shè)計(jì)協(xié)議使得使用RMI開發(fā)分布式程序比使用socket更加輕易。在RMI里,設(shè)計(jì)者就象在調(diào)用一個(gè)本地類的方法一樣,而實(shí)際上是在調(diào)用的時(shí)候相應(yīng)的參數(shù)被發(fā)送到遠(yuǎn)端的對象后被解釋,最后結(jié)果返回給調(diào)用者,下面本文通過開發(fā)一個(gè)文件交換程序來介紹RMI的應(yīng)用。這個(gè)應(yīng)用答應(yīng)客戶端從服務(wù)端交換(或下載)所有類型的文件。第一步是定義一個(gè)遠(yuǎn)程的接口,這個(gè)接口指定的簽名方法將被服務(wù)端提供和被客戶端調(diào)用。
  1.定義一個(gè)遠(yuǎn)程接口
  FileInterface.java代碼如下:
  import java.rmi.Remote;
  import java.rmi.RemoteException;
  public interface FileInterface extends Remote {
    public byte[] downloadFile(String fileName) throws
    RemoteException;
  }
  接口FileInterface提供了一個(gè)downloadFile方法,然后返回一個(gè)相應(yīng)的文件數(shù)據(jù)。
  2.實(shí)現(xiàn)遠(yuǎn)程的接口
  類FileImpl繼續(xù)于UnicastRemoteObject類。這顯示出FileImpl類是用來創(chuàng)建一個(gè)單獨(dú)的、不能復(fù)制的、遠(yuǎn)程的對象,這個(gè)對象使用RMI默認(rèn)的基于TCP的通信方式。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);
     }}}
  3.編寫服務(wù)端
  (1)創(chuàng)建并安裝一個(gè)RMISecurityManager實(shí)例。
 ?。?)創(chuàng)建一個(gè)遠(yuǎn)程對象的實(shí)例。
 ?。?)使用RMI注冊工具來注冊這個(gè)對象。
  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("http://127.0.0.1/FileServer", fi);
     } catch(Exception e) {
       System.out.println("FileServer: "+e.getMessage());
       e.printStackTrace();
     }}}
  聲明Naming.rebind("http://127.0.0.1/FileServer", fi) 中假定了RMI注冊工具(RMI registry )使用并啟動(dòng)了1099端口。假如在其他端口運(yùn)行了RMI注冊工具,則必須在這個(gè)聲明中定義。例如,假如RMI注冊工具在4500端口運(yùn)行,則聲明應(yīng)為:
  Naming.rebind("http://127.0.0.1:4500/FileServer", fi)
  另外我們已經(jīng)同時(shí)假定了我們的服務(wù)端和RMI注冊工具是運(yùn)行在同一臺(tái)機(jī)器上的。否則需要修改rebind方法中的地址。
  4.編寫客戶端
  客戶端可以遠(yuǎn)程調(diào)用遠(yuǎn)程接口(FileInterface)中的任何一個(gè)方法。無論如何實(shí)現(xiàn),客戶端必須先從RMI注冊工具中獲取一個(gè)遠(yuǎn)程對象的引用。當(dāng)引用獲得后,方法downloadFile被調(diào)用。在執(zhí)行過程中,客戶端從命令行中獲得兩個(gè)參數(shù),第一個(gè)是要下載的文件名,第二個(gè)是要下載的機(jī)器的地址,在對應(yīng)地址的機(jī)器上運(yùn)行服務(wù)端。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 = "http://" + 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();
     }}}
  5.運(yùn)行程序
  為了運(yùn)行程序,我們必須使用rmic來編譯生成stubs和skeletons:prompt>rmic FileImpl。這將會(huì)生成FileImpl_Stub.class和FileImpl_Skel.class兩個(gè)文件。stub是客戶端的代理,而skeleton是服務(wù)端的框架。服務(wù)端和客戶端采用javac來編譯(假如服務(wù)端和客戶端在兩個(gè)不同的機(jī)器,則必須復(fù)制一個(gè)FileInterface接口)。
  使用rmiregistry或者start rmiregistry 命令來運(yùn)行RMI注冊工具到window系統(tǒng)默認(rèn)的端口上:
  prompt> rmiregistry portNumber
  RMI注冊工具運(yùn)行之后,需要運(yùn)行服務(wù)FileServer,因?yàn)镽MI的安全機(jī)制將在服務(wù)端發(fā)生作用,所以必須增加一條安全策略:
  grant {
  permission java.security.AllPermission "", "";
  };
  為了運(yùn)行服務(wù)端,需要有除客戶類(FileClient.
  class)之外所有的類文件。確認(rèn)安全策略在policy.txt文件之后,使用如下命令來運(yùn)行服務(wù)器。
  prompt> java -Djava.security.policy=policy.txt FileServer
  為了在其他的機(jī)器運(yùn)行客戶端程序,需要一個(gè)遠(yuǎn)程接口(FileInterface.class)和一個(gè)stub(FileImpl_Stub.class)。 使用如下命令運(yùn)行客戶端:
  prompt> java FileClient fileName machineName
  這里fileName是要下載的文件名,machineName 是要下載的文件所在的機(jī)器(也是服務(wù)端所在的機(jī)器)。假如全部通過的話,當(dāng)客戶端運(yùn)行后,則這個(gè)文件將被下載到本地。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 建昌县| 桃园县| 宁明县| 崇仁县| 论坛| 卢氏县| 南京市| 兰考县| 宜州市| 衡水市| 贵南县| 林州市| 临泉县| 墨脱县| 通渭县| 蓬安县| 曲水县| 额济纳旗| 白玉县| 克东县| 景东| 长子县| 鄢陵县| 梁河县| 池州市| 遂川县| 八宿县| 沂源县| 广平县| 辽源市| 纳雍县| 长沙县| 清涧县| 贵港市| 嘉禾县| 诏安县| 岳普湖县| 湖南省| 通山县| 长武县| 华安县|