<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    談笑有鴻儒,往來無白丁

    在恰當的時間、地點以恰當的方式表達給恰當的人...  閱讀的時候請注意分類,佛曰我日里面是談笑文章,其他是各個分類的文章,積極的熱情投入到寫博的隊伍中來,支持blogjava做大做強!向dudu站長致敬>> > 我的微博敬請收聽
    本篇用實例來說明采用Java進行RMI遠程方法調用的實現方法,從而為分布應用軟件的開發者提供參考和幫助。
      Internet/Intranet的飛速發展使得Web應用日益廣泛而復雜,Web早已不僅僅是超媒體信息的瀏覽工具,它正逐步發展成為分布異構環境中企業應用的通用前端和事務處理的展現窗口。在分布式環境異構中,各種機器所采用的操作系統、網絡通信協議和應用軟件千差萬別,要實現信息共享和軟件資源的整合十分困難,然而一個健壯的分布式計算框架能為可移植的分布式應用軟件開發帶來巨大的便利和好處。
      分布式對象技術主要是在分布式異構環境下建立應用系統框架和對象構件。在應用系統框架的支撐下,開發者可以將軟件功能封裝為更易管理和使用的對象,這些對象可以跨越不同的軟、硬件平臺進行互操作。目前,分布式互操作標準主要有Microsoft的COM/DCOM標準、Sun公司的Java RMI標準和OMG組織的CORBA標準。
      Java RMI調用實例
      Java RMI簡介
      遠程方法調用(RMI,Remote Method Invocation)是jdk1.1中引入的分布式對象軟件包,它的出現大大簡化了分布異構環境中Java應用之間的通信。
      
      要使用RMI,必須構建四個主要的類:遠程對象的本地接口、遠程對象實現、RMI客戶機和RMI服務器。RMI服務器生成遠程對象實現的一個實例,并用一個專有的URL注冊。RMI客戶機在遠程RMI服務器上查找服務對象,并將它轉換成本地接口類型,然后像對待一個本地對象一樣使用它。
      
      下面是一個簡單的RMI實例,RMI客戶機通過RMI服務器提供的方法實現對兩個雙精度浮點數的加減運算。例子雖然很簡單,但掌握了Java RMI調用的基本原理和方法,在實現復雜應用時,我們需要做的也只是完善遠程對象的實現類而已。
      
      RMI實例分析
      
      1.遠程對象的本地接口聲明(RMIOperate.java)
      
      該類僅僅是一個接口聲明,RMI客戶機可以直接使用它,RMI服務器必須通過一個遠程對象來實現它,并用某個專有的URL注冊它的一個實例。
      
      具體代碼如下:
      
      package wf.rmi; //包名
      import java.rmi.*; //導入類包
      /*RMI本地接口必須從Remote接口派生*/
       public interface RMIOperate extends Remote
      {
       /*接口中的具體方法聲明,注意必須聲明拋出RemoteException*/
       public double add(double x, double y) throws RemoteException;
      //輸入兩個浮點數,返回其和
       public double minus(double x, double y) throws RemoteException;
      //輸入兩個浮點數,返回其差
      }
      2.遠程對象實現類(OperateImpl.java)
      這個類應實現RMI客戶機調用的遠程服務對象的本地接口,它必須從UnicastRemoteObject繼承,構造函數應拋出RemoteException異常。
      具體代碼如下:
      
      package wf.rmi; //包名
      //導入需要的類包
      import java.rmi.*;
      import wf.rmi.RMIOperate;
      import java.rmi.server.UnicastRemoteObject;
      public class OperateImpl extends UnicastRemoteObject implements RMIOperate
      {
       /*構造函數*/
       public OperateImpl() throws RemoteException
       {
       }
       /*實現本地接口中聲明的add方法*/
       public double add(double x, double y) throws RemoteException
       {
       double z = x + y;
       return z;
       }
       /*實現本地接口中聲明的minus方法*/
       public double minus(double x, double y) throws RemoteException
       {
       double z = x - y;
       return z;
       }
      }
      3.RMI服務器類(RMIServer.java)
      該類創建遠程對象實現類OperateImpl的一個實例,然后通過一個專有的URL來注冊它。所謂注冊就是通過Java.rmi.Naming.bind()方法或Java.rmi.Naming.rebind()方法,將OperateImpl實例綁定到指定的URL上。
      
      具體實現代碼如下:
      
      package wf.rmi; //包名
      //導入需要的類包
      import java.rmi.Naming;
      import wf.rmi.OperateImpl;
      public class RMIServer
      {
       public static void main(String[] args)
       {
       try
       {
        //創建遠程對象的實現實例
        OperateImpl operObj = new OperateImpl();
        //提示信息
        System.out.println("RMI Server Starting...");
        //將實例注冊到專有的URL
        Naming.rebind("rmi:///RMIOperate", operObj);
        //等待RMI客戶機調用的提示信息
        System.out.println("Waiting RMI Client Invoke...");
       }
       catch(Exception e)
       {
        e.printStackTrace();
       }
       }
      }
      4.RMI客戶機類(RMIClient.java)
      
      RMI客戶使用java.rmi.Naming.lookup()方法,在指定的遠程主機上查找RMI服務對象,若找到就把它轉換成本地接口RMIOperate類型。它與CORBA不同之處在于RMI客戶機必須知道提供RMI服務主機的URL,這個URL可以通過rmi://host/path或rmi://host:port/path來指定,如果省略端口號,就默認使用1099。Java.rmi.Naming.lookup()方法可能產生三個異常:Java.rmi.RemoteException、Java.rmi.NotBoundException、java.net. MalformedURLException,三個異常都需要捕獲。
      
      下面是詳細代碼:
      
      package wf.rmi; //包名
      //導入需要的類包
      import java.rmi.*;
      import java.net.*;
      import java.io.*;
      public class RMIClient
      {
        public static void main(String[] args)
        {
          try
          {
            BufferedReader readIn = new BufferedReader(new
      InputStreamReader(System.in));
            String host = "localhost"; //默認為本地主機
       //帶輸入參數時,將host設置為指定主機
            if (args.length > 0)
              host = args[0];
            //根據指定的URL定位遠程實現對象
      RMIOperate rmiObj = (RMIOperate)Naming.lookup("rmi://" + host +
      "/RMIOperate");      //提示輸入運算參數1
      System.out.println("Please Input Data1: ");
            String str1 = readIn.readLine(); //讀取輸入參數1
            double x = 0;
            try
            {
         x = Double.parseDouble(str1); //分析輸入參數1,轉換為double類型
            }
           catch(NumberFormatException nfe)
            {
              x = 0; //如果轉換異常,則重置x為0
            }
       //提示輸入運算參數2
            System.out.println("Please Input Data2: ");
            String str2 = readIn.readLine();//讀取輸入參數2
            double y = 0;
            try
            {
              y = Double.parseDouble(str2); //分析輸入參數2,轉換為double類型
            }
            catch(NumberFormatException nfe)
            {
              y = 0; //如果轉換異常,則重置y為0
            }
       //調用遠程對象的本地接口方法,實現輸入參數的加、減運算,并輸出結果
           System.out.println("Data1 Add Data2 Result is: " + rmiObj.add(x, y));
           System.out.println("Data1 minus Data2 Result is: " +
        rmiObj.minus(x, y));
          }
          catch(Exception e)
          {
            e.printStackTrace();
          }
        }
      }
      RMI Server/Client的編譯與運行
      
      (1).編譯所有的源代碼(如圖1)
       
      圖1
      (2).生成客戶端存根和服務器框架(如圖2)
       
      圖2
      這將構造OperateImpl_Stub.class和OperateImpl_Skel.class。這時可將所有的Class文件打包成jar,并將其分別置于RMI客戶機和RMI服務器的ClassPath中(如圖3):
       
      圖3
      當然,也可以只將RMIOperate.class、RMIClient.class和OperateImpl_Stub.class復制到RMI客戶機,將RMIOperate.class、OperateImpl.class 、RMIServer.class和OperateImpl_Skel.class復制到RMI服務器。
      (3).啟動RMI注冊(如圖4)
       
      圖4
      (4).運行和調用
      ● 在服務器上執行RMIServer(如圖5)
       
      圖5
      ● 在本地客戶機上運行RMIClient(如圖6)
       
      圖6
      ● 在遠程客戶機上運行RMIClient(須指明RMI服務器主機名或IP地址,如圖7)
       
      圖7
      至此,RMI調用完成。

    ??????? 摘自:http://youngyj1982.bokee.com/
    posted on 2006-12-31 14:18 壞男孩 閱讀(1043) 評論(0)  編輯  收藏 所屬分類: java命令學習
    主站蜘蛛池模板: 国产免费AV片在线观看 | 日本亚洲中午字幕乱码| 理论秋霞在线看免费| a毛片免费观看完整| 国产成人午夜精品免费视频| 国产一级做a爱免费视频| 亚洲国产国产综合一区首页| 亚洲av乱码一区二区三区按摩| 精品国产污污免费网站| 亚洲日韩av无码| 日本亚洲欧美色视频在线播放| 啦啦啦高清视频在线观看免费 | 亚洲日本va午夜中文字幕久久| 亚洲国产精品白丝在线观看| 国产线视频精品免费观看视频| 好大好深好猛好爽视频免费| 亚洲AV无码第一区二区三区| 老司机午夜在线视频免费| 免费a级黄色毛片| 色天使亚洲综合在线观看| 久久精品免费观看国产| 亚洲日本一区二区三区在线不卡| 女人裸身j部免费视频无遮挡| 国产在线国偷精品产拍免费| 亚洲精华液一二三产区| 免费电视剧在线观看| 亚洲高清乱码午夜电影网| 又黄又爽的视频免费看| 国产精品偷伦视频免费观看了| 四虎永久在线精品免费观看地址 | 在线v片免费观看视频| 亚洲精品无码专区| 一二三四视频在线观看中文版免费 | 国产一级高清视频免费看| 一级毛片在线免费视频| 国产免费资源高清小视频在线观看| 十八禁的黄污污免费网站| 免费少妇a级毛片| 久久国产乱子精品免费女| 亚洲国产乱码最新视频| 亚洲另类少妇17p|