轉自:http://m47121.blogchina.com/2555077.html
??????????????????????????????????????編程
我們將首先編寫遠程對象,并將代碼保存為名字為AddServer.Java的文件:
import Java.rmi.*; public interface AddServer extends Remote { public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException; } |
我們來看看上面的代碼。首先,為了使用其內容,我們導入rmi包。然后,我們創建一個擴展了Java.rmi中遠程接口的接口。所有的遠程對象必須擴展該遠程接口,我們將該遠程接口稱為AddServer。在該遠程對象中,有一個名字為AddNumbers的方法,客戶端可以調用這一方法。我們必須記住的是,所有的遠程方法都需要啟動RemoteException方法,有錯誤發生時就會調用該方法。
下面我們開始編寫遠程對象的實現。這是一個實現遠程對象并包含有所有方法代碼的類,將下面的代碼保存為名字為AddServerImpl.Java的文件:
import Java.rmi.*; public class AddServerImpl extends UnicastRemoteObject implements AddServer { public AddServerImpl() { super(); } public int AddNumbers(int firstnumber,int secondnumber) throws RemoteException { return firstnumber + secondnumber; } } |
首先,我們導入rmi包,然后創建一個擴展UnicastRemoteObject和實現創建的遠程對象的類;其次,我們可以為類創建一個缺省的構建器。我們還了解了AddNumbers方法的代碼,它啟動RemoteException。這樣我們就覆蓋了創建的遠程對象中的方法。AddNumbers方法的代碼非常好理解,它接受2個整型參數,然后相加并返回它們的和。
至此,我們已經有了二個Java文件:遠程對象和遠程對象的實現。下面我們將使用Javac命令編譯這二個文件:
編譯遠程對象:
C:\jdk\bin\Javac workingdir\AddServer.Java |
編譯遠程對象實現:
C:\jdk\bin\Javac workingdir\AddServerImpl.Java |
這樣,就會達到二個Java文件和二個類文件,下面我們將創建stub和skeleton。為了創建stub和skeleton文件,我們必須使用rmic編譯器編譯遠程對象實現文件。
用Rmic編譯遠程對象實現文件:
C:\jdk\bin\rmic workingdir\AddServerImpl.Java |
然后,我們就會發現多了2個新建的類文件,它們分別是AddServerImpl_Stub.class 和AddServerImpl_Skel.class 。
The Coding (Contd.)
我們已經編譯了所有的源代碼,下面我們來創建客戶端和服務器端,將下面的代碼保存為名字為RmiServer.Java的文件:
import Java.rmi.*; import Java.net.*; public class RmiServer { public static void main (String args[]) throws RemoteException, MalformedURLException { AddServerImpl add = new AddServerImpl(); Naming.rebind("addnumbers",add); } } |
首先,我們導入Java.rmi包和Java.net包。另外,我們還使用throws從句捕獲任何異常。我們從對象中得出遠程對象實現,使用rebind方法將字符串addnumbers與該對象綁定。下面的例子顯示了綁定的含義:
從現在開始,無論何時客戶端要調用遠程對象,使用字符串addnumbers就可以實現。rebind方法有二個參數:第一個參數是字符串變量,第二個參數是遠程對象實現類的對象。
下面我們來創建客戶端,將下面的代碼保存為名字為RmiClient.Java的文件:
import Java.rmi.*; import Java.net.*; public class RmiClient { public static void main(String args[]) throws RemoteException, MalformedURLException { String url="rmi://127.0.0.1/addnumbers"; AddServer add; add = (AddServer)Naming.lookup(url); int result = add.AddNumbers(10,5); System.out.println(result); } } |
首先,我們導入Java.rmi包和Java.net包,并使用throws從句捕獲所有必要的異常。然后通過利用Naming類中的靜態lookup方法從遠程對象中得到一個對象。(這也是我們無需從Naming類中得到一個對象并調用它。而只使用類名字的原因。)
lookup方法接受遠程對象的完整的URL名字,該URL由完整的機器IP地址以及與對象綁定的字符串(也誻對象的綁定名)組成。在調用遠程對象時,我們使用了RMI協議。lookup方法向我們返回一個對象,在能夠使用它前,我們必須將它的數據類型轉換為與遠程對象的數據類型一致。
Since we have both our server and client source ready, let's compile them both: |
至此,我們已經有了服務器端和客戶端的源代碼,下面我們來編譯這二個源文件:
編譯遠程服務器:
C:\jdk\bin\Javac workingdir\RmiServer.Java |
編譯遠程客戶端:
C:\jdk\bin\Javac workingdir\RmiClient.Java |
在對我們的代碼進行測試前,還必須首先啟動RMI Registry。RMI Registry存儲有所有綁定的數據,沒有它,RMI就不能正常地運行!
啟動Rmi Registry服務器:
C:\jdk\bin\start rmiregistry |
我們會注意到,這時會出現一個空白的DOS提示符窗口,這表明Rmi Registry服務器在運行,注意不要關閉該窗口。然后,我們首先在一個DOS提示符窗口中運行Rmi服務器,然后在另一個DOS提示符窗口中運行Rmi客戶端。
啟動RMI服務器:
C:\jdk\bin\Java workingdir\RmiServer |
啟動RMI客戶端:
C:\jdk\bin\Java workingdir\RmiClient |
如果一切正常,我們應該能夠得到15這個輸出。我們向AddNumbers方法輸入10和5二個數字,該方法將這二者加起來,并將其和15返回給我們。如果得到了15這個輸出,說明我們已經成功地執行了一個遠程方法。當然,在這里,我們并沒有執行真正意義上的遠程方法,因為我們的計算機既是服務器,又是客戶機。如果有計算機網絡,我們就可以方便地進行執行遠程方法的試驗了。