欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

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

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Java RMI 入門(mén)

Java RMI 入門(mén)

Posted on 2007-10-06 23:23:13 in asp.net教程

from:88250的灰色天空 
一 .RMI概述
RMI(Remote Method Invocation)
    RMI是分布式對象軟件包,它簡(jiǎn)化了在多臺計算機上的JAVA應用之間的通信。必須在jdk1.1以上
RMI用到的類(lèi)
     java.rmi.Remote                   所有可以被遠程調用的對象都必須實(shí)現該接口
     java.rmi.server.UnicastRemoteObject  所有可以被遠程調用的對象都必須擴展該類(lèi)
 
什么是RMI
    遠程方法調用是一種計算機之間對象互相調用對方函數,啟動(dòng)對方進(jìn)程的一種機制,
使用這種機制,某一臺計算機上的對象在調用另外一臺計算機上的方法時(shí),使用的程
序語(yǔ)法規則和在本地機上對象間的方法調用的語(yǔ)法規則一樣。

優(yōu)點(diǎn)
這種機制給分布計算的系統設計、編程都帶來(lái)了極大的方便。
只要按照RMI規則設計程序,可以不必再過(guò)問(wèn)在RMI之下的網(wǎng)絡(luò )細節了,如:TCP和Socket等等。
任意兩臺計算機之間的通訊完全由RMI負責。調用遠程計算機上的對象就像本地對象一樣方便。
 
1、面向對象:
RMI可將完整的對象作為參數和返回值進(jìn)行傳遞,而不僅僅是預定義的數據類(lèi)型。
也就是說(shuō),可以將類(lèi)似Java哈西表這樣的復雜類(lèi)型作為一個(gè)參數進(jìn)行傳遞。
 
2、可移動(dòng)屬性:
RMI可將屬性從客戶(hù)機移動(dòng)到服務(wù)器,或者從服務(wù)器移動(dòng)到客戶(hù)機。
 
3、設計方式:
對象傳遞功能使您可以在分布式計算中充分利用面向對象技術(shù)的強大功能,如二層和三層結構系統。
如果用戶(hù)能夠傳遞屬性,那么就可以在自己的解決方案中使用面向對象的設計方式。
所有面向對象的設計方式無(wú)不依靠不同的屬性來(lái)發(fā)揮功能,如果不能傳遞完整的對象——包括實(shí)現和類(lèi)型
——就會(huì )失去設計方式上所提供的優(yōu)點(diǎn)。
 
4、安全性:
RMI使用Java內置的安全機制保證下載執行程序時(shí)用戶(hù)系統的安全。
RMI使用專(zhuān)門(mén)為保護系統免遭惡意小程序侵害而設計的安全管理程序。
5、便于編寫(xiě)和使用
RMI使得Java遠程服務(wù)程序和訪(fǎng)問(wèn)這些服務(wù)程序的Java客戶(hù)程序的編寫(xiě)工作變得輕松、簡(jiǎn)單。
遠程接口實(shí)際上就是Java接口。
為了實(shí)現RMI的功能必須創(chuàng )建遠程對象任何可以被遠程調用的對象必須實(shí)現遠程接口。但遠程
接口本身并不包含任何方法。因而需要創(chuàng )建一個(gè)新的接口來(lái)擴展遠程接口。
新接口將包含所有可以遠程調用的方法。遠程對象必須實(shí)現這個(gè)新接口,由于新的接口擴展了
遠程接口,實(shí)現了新接口,就滿(mǎn)足了遠程對象對實(shí)現遠程接口的要求,所實(shí)現的每個(gè)對象都將
作為遠程對象引用。
 
個(gè)人總結:
    RMI說(shuō)白了,就是提供了一種遠程的方法調用。 這種調用簡(jiǎn)單方便,可以傳遞復雜java對象?,F在流行的j2ee中的EJB的底層實(shí)現技術(shù)就是RMI,EJB的調用就是經(jīng)過(guò)封裝的,更高級的RMI調用。

下面我們就來(lái)寫(xiě)一個(gè)RMI的程序:
 
一.創(chuàng )建RMI程序的6個(gè)步驟:
1、定義一個(gè)遠程接口的接口,該接口中的每一個(gè)方法必須聲明它將產(chǎn)生一個(gè)RemoteException異常。
2、定義一個(gè)實(shí)現該接口的類(lèi)。
3、使用RMIC程序生成遠程實(shí)現所需的殘根和框架。
4、創(chuàng )建一個(gè)服務(wù)器,用于發(fā)布2中寫(xiě)好的類(lèi)。
5. 創(chuàng )建一個(gè)客戶(hù)程序進(jìn)行RMI調用。
6、啟動(dòng)rmiRegistry并運行自己的遠程服務(wù)器和客戶(hù)程序。
 
二. 程序詳細說(shuō)明
 
1.定義一個(gè)遠程接口的接口,該接口中的每一個(gè)方法必須聲明它將產(chǎn)生一個(gè)RemoteException異常。
 
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface I_Hello extends java.rmi.Remote   //需要從Remote繼承
{
       public String SayHello() throws RemoteException;   //需要拋出remote異常
}
 
   上面例子我們定義一個(gè)返回字符串的遠程方法 SayHello(),這個(gè)遠程接口 I_Hello必須是public的 ,它必須從java.rmi.Remote繼承而來(lái),接口中的每一個(gè)方法都必須拋出遠程異常java.rmi.RemoteException。

拋出這個(gè)異常的原因
由于任何遠程方法調用實(shí)際上要進(jìn)行許多低級網(wǎng)絡(luò )操作,因此網(wǎng)絡(luò )錯誤可能在調用過(guò)程中隨時(shí)發(fā)生。
因此,所有的RMI操作都應放到try-catch塊中。
  
2、定義一個(gè)實(shí)現該接口的類(lèi)。
 
 import java.io.PrintStream;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
 
public class Hello extends UnicastRemoteObject   //必須從UnicastRemoteObject  繼承
                   implements I_Hello
{
        public Hello() throws RemoteException     //需要一個(gè)拋出Remote異常的默認初始化方法
        {
        }
 
        public String SayHello()     //這個(gè)是實(shí)現I_Hello接口的方法
        {
           return "Hello world !!";
        }
}
 
實(shí)現接口的類(lèi)必須繼承UnicastRemoteObject類(lèi)。
擴展java.rmi.server.UnicastRemoteObject
UnicastRemoteObject顧名思義,是讓客戶(hù)機與服務(wù)器對象實(shí)例建立一對一的連接。
 
3、使用RMIC程序生成遠程實(shí)現所需的殘根Stub 和 框架。
   2中的Hello 編譯好以后,我們就可以用RMIC命令來(lái)生成殘根Stub
   在Dos窗口里,到Hello.class 所在目錄,運行以下命令:
   rmic Hello
   
   命令執行完以后,將會(huì )在當前目錄生成一個(gè) Hello_Stub.class 這個(gè)就是我們遠程調用時(shí)需要的類(lèi)
 
參考:
在RMI中,客戶(hù)機上生成的調動(dòng)調用參數和反調動(dòng)返回值的代碼稱(chēng)為殘根。有的書(shū)上稱(chēng)這部分代碼為“主干”。
服務(wù)器上生成的反調動(dòng)調用參數和進(jìn)行實(shí)際方法調用調動(dòng)返回值的代碼稱(chēng)為框架。
生成殘根和框架的工具
Rmic命令行工具(RMI Compiler)
格式:
Rmic classname
 
4、創(chuàng )建一個(gè)服務(wù)器,用于發(fā)布2中寫(xiě)好的類(lèi)。
 
    import java.rmi.*;
public class RMI_Server
{
    public static void main(String[] args)
    {
        try
        {
            Hello hello = new Hello();                //實(shí)例化要發(fā)布的類(lèi)
            Naming.rebind("RMI_Hello", hello);      //綁定RMI名稱(chēng) 進(jìn)行發(fā)布
            System.out.println("=== Hello server Ready === ");
        }
        catch(Exception exception)
        {
            exception.printStackTrace();
        }
    }
}
 
5. 創(chuàng )建一個(gè)客戶(hù)程序進(jìn)行RMI調用。
 
import java.rmi.*;
public class RMI_Client {
    public static void main(String[] args) {
        try
        {
           I_Hello hello = (I_Hello) Naming.lookup("RMI_Hello");  //通過(guò)RMI名稱(chēng)查找遠程對象
            System.out.println(hello.SayHello());                        //調用遠程對象的方法
        } catch (Exception e)
        {
          e.printStackTrace();
        }
    }

}
 
Naming.lookup("RMI_Hello") 其中的參數“RMI_Hello”只是針對本機的RMI查找,如果是異地的RMI調用請參照  rmi://127.0.0.1:1099/RMI_Hello       端口1099是默認的RMI端口,如果你啟動(dòng) rmiregistry 的時(shí)候(見(jiàn)第6點(diǎn))沒(méi)有指定特殊的端口號,默認就是1099
 
到此 我們 所有的代碼編寫(xiě)都完成了,不過(guò)不要急著(zhù)去運行,請跟隨第6點(diǎn)去運行,因為rmi 調用還會(huì )遇到一些特別的情況,偶花了牛勁,才找到原因的,許多剛用RMI的人,常常被這些問(wèn)題搞得吐血
 
6、啟動(dòng)rmiRegistry并運行自己的遠程服務(wù)器和客戶(hù)程序。
 1)服務(wù)器的運行
    先在DOS下運行 rmiregistry     這個(gè)命令是開(kāi)啟RMI的注冊服務(wù),開(kāi)啟以后我們的server程序才能調用rebing方法發(fā)布我們的類(lèi)
 
    然后,運行我們的server程序  RMI_Server    這里是最容易出錯的,參見(jiàn)下面注意事項。
     注意:
         如果提示找不到Stub類(lèi),這個(gè)需要用下面的命令來(lái)運行
 java.exe -Djava.rmi.server.codebase=file:/E:\MIS_Interface\momo\TestEasy\classes/  RMI_Server
 
藍字部分指定了stub類(lèi)的路徑。
 
  有人會(huì )問(wèn),我已經(jīng)把stub 通過(guò)-classpath 加到類(lèi)路徑里面了,為什么還沒(méi)有提示這個(gè)錯誤呢?原因是這樣的: 這里提示的找不到stub類(lèi),不是由你寫(xiě)的RMI_Server這個(gè)程序引起的,是由rmi注冊服務(wù)器報告的異常,也就是我們前面啟動(dòng)的 rmiregistry ,因為你寫(xiě)的RMI_Server 要求RMI注冊服務(wù)器注冊一個(gè)新的類(lèi),自然RMI服務(wù)器必須知道你的類(lèi)放在哪里,所以我們通過(guò)  -Djava.rmi.server.codebase 這個(gè)運行參數來(lái)指定
  你也可以通過(guò)修改操作系統的classpath 環(huán)境變量 來(lái)指定stub的位置,只不過(guò)太麻煩
 
2) 客戶(hù)端的運行
      直接運行RMI_Client  即可  注意 把 Stub 和 接口 I_Hello 加到類(lèi)路徑里
  
    通常第一次運行 客戶(hù)端都會(huì )報一個(gè)錯誤:   Access  XXXX 不記得具體的了,反正就是“訪(fǎng)問(wèn)權限限制”, 這是因為RMI的服務(wù)需要授權,外部程序才能訪(fǎng)問(wèn),所以我們要改動(dòng) jre的安全配置文件,來(lái)開(kāi)放權限,  具體如下:
 
   打開(kāi)你的jdk目錄下的這個(gè)文件 C:\Program Files\Java\jdk1.5.0_04\jre\lib\security\java.policy
在文件最后加入下面代碼:
 grant {
           permission java.net.SocketPermission "*:1024-65535",
                "connect,accept";
           permission java.net.SocketPermission "*:80","connect";
        };
此代碼,開(kāi)放了端口的connect訪(fǎng)問(wèn)權限
 
注意 你應該修改服務(wù)器那臺機子的安全配置文件,也就是你運行 rmiregistry 和 RMI_Server的機子
另外,很多人修改完以后,仍然報這個(gè)錯誤,多數情況是由于你沒(méi)有修改到正確的jdk 下的文件,而是修改到其他jdk的文件, 我們安裝oracle , Weblogic等等軟件的時(shí)候都會(huì )自帶一個(gè) jdk,他們會(huì )自動(dòng)在操作系統的環(huán)境變量里面 加入jdk的路徑,所以,你先要確定你運行服務(wù)器端程序是用哪個(gè)jdk,再修改這個(gè)jdk下的配置文件,確定當前jdk的路徑很簡(jiǎn)單  開(kāi)始 -》運行-》rmiregistry 看看這個(gè)DOS窗口標題 的路徑,就是你當前系統默認jdk的路徑了
 
客戶(hù)端正常運行以后,就會(huì )出現以下結果:
Hello world !!
 
這些字符是通過(guò)RMI調用遠程服務(wù)器的類(lèi)返回的結果
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
rmi(Remote Method Invocation ) 學(xué)習 - what's j...
Java分布式處理技術(shù)(RMI,JDNI)
Java RMI與RPC,JMS的比較
漫談EJB(1)
RMI-Java遠程方法調用的實(shí)現(二)
第 8 章
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久