javascript解析xml.doc_第1頁
javascript解析xml.doc_第2頁
javascript解析xml.doc_第3頁
javascript解析xml.doc_第4頁
javascript解析xml.doc_第5頁
已閱讀5頁,還剩5頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

本篇用實例來說明采用Java進行RMI遠程方法調用及CORBA服務調用的實現方法,并分析它們的異同,從而為分布應用軟件的開發者提供參考和幫助。 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、. MalformedURLException,三個異常都需要捕獲。 下面是詳細代碼: package wf.rmi; /包名/導入需要的類包import java.rmi.*;import .*;import java.io.*;public class RMIClientpublic static void main(String args)tryBufferedReader readIn = new BufferedReader(new InputStreamReader(System.in);String host = localhost; /默認為本地主機 /帶輸入參數時,將host設置為指定主機if (args.length 0) host = args0; /根據指定的URL定位遠程實現對象RMIOperate rmiObj = (RMIOperate)Naming.lookup(rmi:/ + host + /RMIOperate);/提示輸入運算參數1System.out.println(Please Input Data1: );String str1 = readIn.readLine(); /讀取輸入參數1double x = 0;try x = Double.parseDouble(str1); /分析輸入參數1,轉換為double類型catch(NumberFormatException nfe)x = 0; /如果轉換異常,則重置x為0 /提示輸入運算參數2System.out.println(Please Input Data2: );String str2 = readIn.readLine();/讀取輸入參數2double y = 0;tryy = 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從Java1.1開始,RMI使得運行于不同JVM(包括不同主機)上的Java應用程序可以彼此通話。 即:一個JVM中的Java應用程序可以調用另一JVM上的對象(遠程對象)所定義的方法。 Java RMI有著重要的意義。RMI在Java網絡編程和高級編程中都有重要的應用,如EJB, Jini等。 Java2對RMI做了很多增強和改進,如安全性,動態代碼下載等。 本文給出了一個最簡單的例子,以說明其中的一些基本原理。本文的特點是注重了實際開發和真正的運行 環境相結合,模擬了RMI真正的開發和運行過程。 1. 實現遠程接口,生成遠程對象,存根(Stub)和框架(Skeleton) 實現遠程接口,遠程接口告訴JVM:實現了該接口的對象可以遠程調用及有哪些方法可以調用。 本例子中定義了sayHello()。由于遠程調用會涉及到網絡通訊,因此這些方法都要拋出RemoteException. 遠程接口和遠程對象可以由A開發,并把遠程接口(Hello)d打包分給Client端開發者B。 建立f:server目錄,把Hello.java和HelloImpl.java拷貝到該目錄中。 / Hello.java package jdeveloper.rmi; import java.rmi.Remote; import java.rmi.RemoteException; public interface Hello extends Remote String sayHello() throws RemoteException; 生成遠程對象. / HelloImpl.java package jdeveloper.rmi; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject; public class HelloImpl extends UnicastRemoteObject implements Hello public HelloImpl() throws RemoteException super(); public String sayHello() return Hello World!; public static void main(String args) / Create and install a security manager if (System.getSecurityManager() = null) System.setSecurityManager(new RMISecurityManager(); try Hello obj = new HelloImpl(); / Bind this object instance to the name HelloServer Naming.rebind(HelloServer, obj); System.out.println(HelloServer bound in registry); catch (Exception e) System.out.println(HelloImpl err: + e.getMessage(); e.printStackTrace(); 存根(Stub)和框架(Skeleton) f: cd server javac -d . Hello.java javac -d . HelloImpl.java rmic -d . jdeveloper.rmi.HelloImpl jar cvf hello.jar jdeveloperrmiHello.class 把hello.jar分發給Client端的開發者B。 存根(Stub)的存放! 存根(Stub)是動態下載的。Client通過存根(Stub)和遠程對象的框架(Skeleton)通訊,對Client來 講就象操作本地對象一樣。在大多數情況下,可下載的代碼放到http服務器的某個目錄中。本例子放到http:/hjc/rmi下。 hjc:機器名,rmi:http的一個目錄。如果只是單機測試則可以放到某個目錄下 如f:serverclasses. 本文將對以上兩種方法都給出運行的步驟(policy文件和bat文件)。 2. 實現Client端程序 / HelloClient.java package jdeveloper.rmi; import java.rmi.RMISecurityManager; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.NotBoundException; public class HelloClient public static void main(String args) throws Exception System.setSecurityManager(new RMISecurityManager(); Hello RemoteObj = (Hello)Naming.lookup(/+ args0 +/HelloServer); System.out.println(RemoteObj.sayHello(); 建立f:client目錄,把HelloClient.java拷貝到該目錄中。 建立f:clientclasses目錄,把hello.jar拷貝到該目錄中。 f: cd client javac -classpath %CLASSPATH%;f:clientclasseshello.jar -d . HelloClient.java 3. 運行程序 啟動DOS窗口 set classpath= start rmiregistry A.以單機方式運行 建立f:serverclassesjdeveloperrmi目錄 f: cd f:serverclasses copy f:serverhello.jar . copy f:serverjdeveloperrmiHelloImpl_Stub.class f:serverclassesjdeveloperrmi jar xvf hello.jar 啟動新的DOS窗口 把 starthelloserver.bat 和 rmiserver.policy 放到f:server 運行 starthelloserver starthelloserver.bat SET CP=f:server;f:serverclasseshello.jar echo using classpath: %CP% java -classpath %CP% -Djava.rmi.server.codebase=file:/f:serverclasses/ -Djava.rmi.server.hostname=hjc -Djava.security.policy=rmiserver.policy jdeveloper.rmi.HelloImpl rmiserver.policy grant permission .SocketPermission *:1024-65535, connect; ; 啟動新的DOS窗口 把 starthelloclient.bat 和 rmiclient.policy 放到f:client 運行 starthelloclient starthelloclient.bat echo off set CP=f:client;f:clientclasseshello.jar echo using classpath %CP% echo on java -classpath %CP% -Djava.rmi.server.codebase=file:/f:serverclasses/ -Djava.security.policy=rmiclient.policy jdeveloper.rmi.HelloClient %1 rmiclient.policy grant permission .SocketPermission *:1024-65535, connect; permission java.io.FilePermission f:serverclasses-, read; ; B.以網絡方式運行 建立 apache_pathhtdocsrmijdeveloperrmi目錄 cd apache_pathhtdocsrmi copy f:serverhello.jar . copy f:serverjdeveloperrmiHelloImpl_Stub.class apache_pathhtdocsrmijdeveloperrmi jar xvf hello.jar 把 starthellohttpserver.bat 和 rmihttpserver.policy 放到f:server 啟動新的DOS窗口 運行 starthellohttpserve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論