国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
RMI-Java遠(yuǎn)程方法調(diào)用的實(shí)現(xiàn)(二)
四、一個(gè)簡(jiǎn)單RMI應(yīng)用的實(shí)現(xiàn)一個(gè)正常工作的RMI系統(tǒng)由下面幾個(gè)部分組成:●   遠(yuǎn)程服務(wù)的接口定義●   遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn)●   樁(Stub)和框架(Skeleton)文件●   一個(gè)運(yùn)行遠(yuǎn)程服務(wù)的服務(wù)器●   一個(gè)RMI命名服務(wù),它允許客戶端去發(fā)現(xiàn)這個(gè)遠(yuǎn)程服務(wù)●   類文件的提供者(一個(gè)HTTP或者FTP服務(wù)器)●   一個(gè)需要這個(gè)遠(yuǎn)程服務(wù)的客戶端程序 1、遠(yuǎn)程服務(wù)的接口定義   RMI對(duì)接口有著強(qiáng)烈的依賴。在需要?jiǎng)?chuàng)建一個(gè)遠(yuǎn)程對(duì)象的時(shí)候,我們通過(guò)傳遞一個(gè)接口來(lái)隱藏基層的實(shí)施細(xì)節(jié)。所以客戶得到遠(yuǎn)程對(duì)象的一個(gè)句柄正好同一些本地的根代碼連接,有后者負(fù)責(zé)通過(guò)網(wǎng)絡(luò)通信。但我們并不關(guān)心這些事情,通過(guò)自己的接口句柄發(fā)送消息即可。   創(chuàng)建一個(gè)遠(yuǎn)程接口時(shí),必須遵守下列規(guī)則:1)、遠(yuǎn)程接口必須為public屬性(不能有“包訪問(wèn)”;也就是說(shuō),他不能是“友好的”)。否則,一旦客戶試圖裝載一個(gè)實(shí)現(xiàn)了遠(yuǎn)程接口的遠(yuǎn)程對(duì)象,就會(huì)得到一個(gè)錯(cuò)誤。、2)、遠(yuǎn)程接口必須擴(kuò)展接口java.rmi.Remote。3)、除與應(yīng)用程序本身有關(guān)的違例,遠(yuǎn)程接口中的每個(gè)方法都必須在自己的throws從句中聲明java.rmi.RemoteException.4)、作為參數(shù)或返回值傳遞的一個(gè)遠(yuǎn)程對(duì)象(不管是直接,還是本地對(duì)象中嵌入)必須聲明為遠(yuǎn)程接口,不可聲明為實(shí)施類。第一步就是建立和編譯服務(wù)接口的Java代碼。這個(gè)接口定義了所有的提供遠(yuǎn)程服務(wù)的功能://Calculator.java//define the interfaceimport java.rmi.Remote;public interface Calculator extends Remote{   public long add(long a, long b)     throws java.rmi.RemoteException;    public long sub(long a, long b)     throws java.rmi.RemoteException;    public long mul(long a, long b)     throws java.rmi.RemoteException;    public long div(long a, long b)     throws java.rmi.RemoteException; } 注意,這個(gè)接口繼承自Remote,每一個(gè)定義的方法都必須拋出一個(gè)RemoteException異常對(duì)象。 2、遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn)第二步,對(duì)遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn),這是一個(gè)CalculatorImpl類文件://CalculatorImpl.java//Implementationimport java.rmi.server.UnicastRemoteObjectpublic class CalculatorImpl extends UnicastRemoteObject implements Calculator {    public CalculatorImpl()     throws java.rmi.RemoteException {     super();    }    public long add(long a, long b)     throws java.rmi.RemoteException {     return a + b;    }    public long sub(long a, long b)     throws java.rmi.RemoteException {     return a - b;    }    public long mul(long a, long b)     throws java.rmi.RemoteException {     return a * b;    }    public long div(long a, long b)     throws java.rmi.RemoteException {     return a / b;    } }    這個(gè)實(shí)現(xiàn)類使用了UnicastRemoteObject去聯(lián)接RMI系統(tǒng)。在這個(gè)例子中,是直接的從UnicastRemoteObject這個(gè)類上繼承的,事實(shí)上并不一定要這樣做,如果一個(gè)類不是從UnicastRmeoteObject上繼承,那必須使用它的exportObject()方法去聯(lián)接到RMI。   如果一個(gè)類繼承自UnicastRemoteObject,那么它必須提供一個(gè)構(gòu)造函數(shù)并且聲明拋出一個(gè)RemoteException對(duì)象。當(dāng)這個(gè)構(gòu)造函數(shù)調(diào)用了super(),它久激活UnicastRemoteObject中的代碼完成RMI的連接和遠(yuǎn)程對(duì)象的初始化。 3、樁(Stubs)和框架(Skeletons)接下來(lái)就是要使用RMI編譯器rmic來(lái)生成樁和框架文件,這個(gè)編譯運(yùn)行在遠(yuǎn)程服務(wù)實(shí)現(xiàn)類文件上。>rmic CalculatorImpl在相關(guān)目錄下運(yùn)行上面的命令,成功執(zhí)行完上面的命令將會(huì)發(fā)現(xiàn)一個(gè)Calculator_stub.class文件,如果使用的Java2SDK,那么還可以發(fā)現(xiàn)Calculator_Skel.class文件。|||  4、主機(jī)服務(wù)器遠(yuǎn)程RMI服務(wù)必須是在一個(gè)服務(wù)器中運(yùn)行的。下面定義的CalculatorServer類是一個(gè)非常簡(jiǎn)單的服務(wù)器。//CalculatorServer.javaimport java.rmi.Naming;public class CalculatorServer {   public CalculatorServer() {   try {   Calculator c = new CalculatorImpl();   Naming.rebind("rmi://localhost:1099/CalculatorService", c);   } catch (Exception e) {   System.out.println("Trouble: " + e);   }   }   public static void main(String args) {   new CalculatorServer();   }} 5、客戶端客戶端源代碼//CalculatorClient.javaimport java.rmi.Naming; import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.NotBoundException; public class CalculatorClient {    public static void main(String args) {     try {      Calculator c = (Calculator)            Naming.lookup(        "rmi://localhost           /CalculatorService");      System.out.println( c.sub(4, 3) );      System.out.println( c.add(4, 5) );      System.out.println( c.mul(3, 6) );      System.out.println( c.div(9, 3) );     }     catch (MalformedURLException murle) {      System.out.println();      System.out.println(       "MalformedURLException");      System.out.println(murle);     }     catch (RemoteException re) {      System.out.println();      System.out.println(           "RemoteException");      System.out.println(re);     }     catch (NotBoundException nbe) {      System.out.println();      System.out.println(           "NotBoundException");      Syst四、一個(gè)簡(jiǎn)單RMI應(yīng)用的實(shí)現(xiàn)一個(gè)正常工作的RMI系統(tǒng)由下面幾個(gè)部分組成:●   遠(yuǎn)程服務(wù)的接口定義●   遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn)●   樁(Stub)和框架(Skeleton)文件●   一個(gè)運(yùn)行遠(yuǎn)程服務(wù)的服務(wù)器●   一個(gè)RMI命名服務(wù),它允許客戶端去發(fā)現(xiàn)這個(gè)遠(yuǎn)程服務(wù)●   類文件的提供者(一個(gè)HTTP或者FTP服務(wù)器)●   一個(gè)需要這個(gè)遠(yuǎn)程服務(wù)的客戶端程序 1、遠(yuǎn)程服務(wù)的接口定義   RMI對(duì)接口有著強(qiáng)烈的依賴。在需要?jiǎng)?chuàng)建一個(gè)遠(yuǎn)程對(duì)象的時(shí)候,我們通過(guò)傳遞一個(gè)接口來(lái)隱藏基層的實(shí)施細(xì)節(jié)。所以客戶得到遠(yuǎn)程對(duì)象的一個(gè)句柄正好同一些本地的根代碼連接,有后者負(fù)責(zé)通過(guò)網(wǎng)絡(luò)通信。但我們并不關(guān)心這些事情,通過(guò)自己的接口句柄發(fā)送消息即可。   創(chuàng)建一個(gè)遠(yuǎn)程接口時(shí),必須遵守下列規(guī)則:1)、遠(yuǎn)程接口必須為public屬性(不能有“包訪問(wèn)”;也就是說(shuō),他不能是“友好的”)。否則,一旦客戶試圖裝載一個(gè)實(shí)現(xiàn)了遠(yuǎn)程接口的遠(yuǎn)程對(duì)象,就會(huì)得到一個(gè)錯(cuò)誤。、2)、遠(yuǎn)程接口必須擴(kuò)展接口java.rmi.Remote。3)、除與應(yīng)用程序本身有關(guān)的違例,遠(yuǎn)程接口中的每個(gè)方法都必須在自己的throws從句中聲明java.rmi.RemoteException.4)、作為參數(shù)或返回值傳遞的一個(gè)遠(yuǎn)程對(duì)象(不管是直接,還是本地對(duì)象中嵌入)必須聲明為遠(yuǎn)程接口,不可聲明為實(shí)施類。第一步就是建立和編譯服務(wù)接口的Java代碼。這個(gè)接口定義了所有的提供遠(yuǎn)程服務(wù)的功能://Calculator.java//define the interfaceimport java.rmi.Remote;public interface Calculator extends Remote{   public long add(long a, long b)     throws java.rmi.RemoteException;    public long sub(long a, long b)     throws java.rmi.RemoteException;    public long mul(long a, long b)     throws java.rmi.RemoteException;    public long div(long a, long b)     throws java.rmi.RemoteException; } 注意,這個(gè)接口繼承自Remote,每一個(gè)定義的方法都必須拋出一個(gè)RemoteException異常對(duì)象。 2、遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn)第二步,對(duì)遠(yuǎn)程服務(wù)接口的具體實(shí)現(xiàn),這是一個(gè)CalculatorImpl類文件://CalculatorImpl.java//Implementationimport java.rmi.server.UnicastRemoteObjectpublic class CalculatorImpl extends UnicastRemoteObject implements Calculator {    public CalculatorImpl()     throws java.rmi.RemoteException {     super();    }    public long add(long a, long b)     throws java.rmi.RemoteException {     return a + b;    }    public long sub(long a, long b)     throws java.rmi.RemoteException {     return a - b;    }    public long mul(long a, long b)     throws java.rmi.RemoteException {     return a * b;    }    public long div(long a, long b)     throws java.rmi.RemoteException {     return a / b;    } }    這個(gè)實(shí)現(xiàn)類使用了UnicastRemoteObject去聯(lián)接RMI系統(tǒng)。在這個(gè)例子中,是直接的從UnicastRemoteObject這個(gè)類上繼承的,事實(shí)上并不一定要這樣做,如果一個(gè)類不是從UnicastRmeoteObject上繼承,那必須使用它的exportObject()方法去聯(lián)接到RMI。   如果一個(gè)類繼承自UnicastRemoteObject,那么它必須提供一個(gè)構(gòu)造函數(shù)并且聲明拋出一個(gè)RemoteException對(duì)象。當(dāng)這個(gè)構(gòu)造函數(shù)調(diào)用了super(),它久激活UnicastRemoteObject中的代碼完成RMI的連接和遠(yuǎn)程對(duì)象的初始化。 3、樁(Stubs)和框架(Skeletons)接下來(lái)就是要使用RMI編譯器rmic來(lái)生成樁和框架文件,這個(gè)編譯運(yùn)行在遠(yuǎn)程服務(wù)實(shí)現(xiàn)類文件上。>rmic CalculatorImpl在相關(guān)目錄下運(yùn)行上面的命令,成功執(zhí)行完上面的命令將會(huì)發(fā)現(xiàn)一個(gè)Calculator_stub.class文件,如果使用的Java2SDK,那么還可以發(fā)現(xiàn)Calculator_Skel.class文件。|||  4、主機(jī)服務(wù)器遠(yuǎn)程RMI服務(wù)必須是在一個(gè)服務(wù)器中運(yùn)行的。下面定義的CalculatorServer類是一個(gè)非常簡(jiǎn)單的服務(wù)器。//CalculatorServer.javaimport java.rmi.Naming;public class CalculatorServer {   public CalculatorServer() {   try {   Calculator c = new CalculatorImpl();   Naming.rebind("rmi://localhost:1099/CalculatorService", c);   } catch (Exception e) {   System.out.println("Trouble: " + e);   }   }   public static void main(String args) {   new CalculatorServer();   }} 5、客戶端客戶端源代碼//CalculatorClient.javaimport java.rmi.Naming; import java.rmi.RemoteException; import java.net.MalformedURLException; import java.rmi.NotBoundException; public class CalculatorClient {    public static void main(String args) {     try {      Calculator c = (Calculator)            Naming.lookup(        "rmi://localhost           /CalculatorService");      System.out.println( c.sub(4, 3) );      System.out.println( c.add(4, 5) );      System.out.println( c.mul(3, 6) );      System.out.println( c.div(9, 3) );     }     catch (MalformedURLException murle) {      System.out.println();      System.out.println(       "MalformedURLException");      System.out.println(murle);     }     catch (RemoteException re) {      System.out.println();      System.out.println(           "RemoteException");      System.out.println(re);     }     catch (NotBoundException nbe) {      System.out.println();      System.out.println(           "NotBoundException");      System.out.println(nbe);     }     catch (     java.lang.ArithmeticException                 ae) { |||      System.out.println();      System.out.println(      "java.lang.ArithmeticException");      System.out.println(ae);     }    } }  6、 運(yùn)行RMI系統(tǒng)上面建立了所有運(yùn)行這個(gè)簡(jiǎn)單RMI系統(tǒng)所需的文件,現(xiàn)在可以運(yùn)行這個(gè)RMI系統(tǒng)了,由于是在命令控制臺(tái)下運(yùn)行這個(gè)系統(tǒng)的,所以必須開(kāi)啟三個(gè)控制臺(tái)窗口,一個(gè)運(yùn)行服務(wù)器,一個(gè)運(yùn)行客戶端,還有一個(gè)運(yùn)行RMIRegistry。1、首先運(yùn)行注冊(cè)程序RMIRegistry:>rmiregistry2、在第二個(gè)控制臺(tái)里,運(yùn)行服務(wù)器CalculatorService,因?yàn)镽MI的安全機(jī)制將在服務(wù)端發(fā)生作用,所以必須增加一條安全策略。以下是對(duì)應(yīng)安全策略的例子 grant {permission java.security.AllPermission "", "";};注意:這是一條最簡(jiǎn)單的安全策略,它允許任何人做任何事,對(duì)于更加關(guān)鍵性的應(yīng)用,你必須指定更加詳細(xì)安全策略?,F(xiàn)在為了運(yùn)行服務(wù)端,需要除客戶類(CalculatorClient.class)之外的所有的類文件。確認(rèn)安全策略在policy.txt文件之后,使用如下命令來(lái)運(yùn)行服務(wù)器。> java -Djava.security.policy=policy.txt CalculatorServer這個(gè)服務(wù)器就開(kāi)始工作了,把接口的實(shí)現(xiàn)加載到內(nèi)存等待客戶端的聯(lián)接。3、現(xiàn)在切換到第三個(gè)控制臺(tái),啟動(dòng)客戶端。為了在其他的機(jī)器運(yùn)行客戶端程序需要一個(gè)遠(yuǎn)程接口(Calculator.class) 和一個(gè)stub(CalculatorImpl_Stub.class)。 使用如下命令運(yùn)行客戶端prompt> java -Djava.security.policy=policy.txt CalculatorClient  五、結(jié)束語(yǔ)RMI為真正面向?qū)ο蟮姆植际接?jì)算提供了可靠的平臺(tái)。 您可使用RMI連接到Java組件,或用其它語(yǔ)言編寫的現(xiàn)有 的組件。隨著Java在您的環(huán)境中所具備的重要性的日益 增加,您還可擴(kuò)大Java的使用范圍,并獲得所有的好處 --無(wú)需移植、低維護(hù)成本和安全而保密的環(huán)境。RMI為您 提供了循序漸進(jìn)地將Java擴(kuò)展到您的系統(tǒng)所有部分的平 臺(tái),您可根據(jù)需要適時(shí)地添加Java服務(wù)器和客戶機(jī)。只 要您添加了Java,那么它所有的好處都會(huì)隨之而來(lái)。RMI 則使之更簡(jiǎn)單、保密和強(qiáng)大em.out.println(nbe);     }     catch (     java.lang.ArithmeticException                 ae) { |||      System.out.println();      System.out.println(      "java.lang.ArithmeticException");      System.out.println(ae);     }    } }  6、 運(yùn)行RMI系統(tǒng)上面建立了所有運(yùn)行這個(gè)簡(jiǎn)單RMI系統(tǒng)所需的文件,現(xiàn)在可以運(yùn)行這個(gè)RMI系統(tǒng)了,由于是在命令控制臺(tái)下運(yùn)行這個(gè)系統(tǒng)的,所以必須開(kāi)啟三個(gè)控制臺(tái)窗口,一個(gè)運(yùn)行服務(wù)器,一個(gè)運(yùn)行客戶端,還有一個(gè)運(yùn)行RMIRegistry。1、首先運(yùn)行注冊(cè)程序RMIRegistry:>rmiregistry2、在第二個(gè)控制臺(tái)里,運(yùn)行服務(wù)器CalculatorService,因?yàn)镽MI的安全機(jī)制將在服務(wù)端發(fā)生作用,所以必須增加一條安全策略。以下是對(duì)應(yīng)安全策略的例子 grant {permission java.security.AllPermission "", "";};注意:這是一條最簡(jiǎn)單的安全策略,它允許任何人做任何事,對(duì)于更加關(guān)鍵性的應(yīng)用,你必須指定更加詳細(xì)安全策略?,F(xiàn)在為了運(yùn)行服務(wù)端,需要除客戶類(CalculatorClient.class)之外的所有的類文件。確認(rèn)安全策略在policy.txt文件之后,使用如下命令來(lái)運(yùn)行服務(wù)器。> java -Djava.security.policy=policy.txt CalculatorServer這個(gè)服務(wù)器就開(kāi)始工作了,把接口的實(shí)現(xiàn)加載到內(nèi)存等待客戶端的聯(lián)接。3、現(xiàn)在切換到第三個(gè)控制臺(tái),啟動(dòng)客戶端。為了在其他的機(jī)器運(yùn)行客戶端程序需要一個(gè)遠(yuǎn)程接口(Calculator.class) 和一個(gè)stub(CalculatorImpl_Stub.class)。 使用如下命令運(yùn)行客戶端prompt> java -Djava.security.policy=policy.txt CalculatorClient  五、結(jié)束語(yǔ)RMI為真正面向?qū)ο蟮姆植际接?jì)算提供了可靠的平臺(tái)。 您可使用RMI連接到Java組件,或用其它語(yǔ)言編寫的現(xiàn)有 的組件。隨著Java在您的環(huán)境中所具備的重要性的日益 增加,您還可擴(kuò)大Java的使用范圍,并獲得所有的好處 --無(wú)需移植、低維護(hù)成本和安全而保密的環(huán)境。RMI為您 提供了循序漸進(jìn)地將Java擴(kuò)展到您的系統(tǒng)所有部分的平 臺(tái),您可根據(jù)需要適時(shí)地添加Java服務(wù)器和客戶機(jī)。只 要您添加了Java,那么它所有的好處都會(huì)隨之而來(lái)。RMI 則使之更簡(jiǎn)單、保密和強(qiáng)大
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
RMI示例。_無(wú)名小卒
rmi入門教程,簡(jiǎn)單明了(轉(zhuǎn))
Java RMI 框架(遠(yuǎn)程方法調(diào)用)
JAVA NoClassDefFoundError
小湖~
Java RMI
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服