遠(yuǎn)程方法調(diào)用(RMI)是java中最早的關(guān)于處理對象分布的機制,了解其工作原理為今后學(xué)習(xí)RMI-IIOP,XML-RPC以及SOAP等都有較大的幫助。
簡單歸納如下:
1.RMI允許一個JVM實例中的所有對象調(diào)用另一個JVM實例中所有對象的方法;
這兩個JVM可以運行在同一臺機器的不同進(jìn)程上,也可以運行在不同的機器上。
2.可以被遠(yuǎn)程訪問的對象必須創(chuàng)建一個接口,并extends java.rmi.Remote接口;
接口中定義的所有方法必須拋出java.rmi.RemoteException。
3.可以被遠(yuǎn)程訪問的對象除了要實現(xiàn)該接口外,還要extends java.rmi.server.UnicastRemoteObject;
4.使用rmic工具生成_Stub類和_Skel類;
在cmd窗口中,輸入:rmic 編譯好的實現(xiàn)類名
若出現(xiàn)Class Not Found錯,則檢查class路徑設(shè)置是否正確。
這樣,客戶端實際是在對_Stub對象進(jìn)行操作,而不是對實際的遠(yuǎn)程對象操作。服務(wù)器端則用_Skel對象和實際的遠(yuǎn)程對象進(jìn)行通信。
5.編寫服務(wù)器端應(yīng)用程序;
需要用Naming.rebind()方法將注冊名與對象綁定在一起。
6.編寫客戶端程序;
首先要用Naming.lookup()方法搜索注冊名,之后cast成遠(yuǎn)程接口。
這里,如果是在不同的機器上分別開發(fā)客戶端和服務(wù)器端的話,則需要將接口復(fù)制到兩邊。
最后,就是象調(diào)用本地方法一樣,調(diào)用該遠(yuǎn)程接口的方法,實現(xiàn)分布計算的功能了。
7.要運行RMI的話,需要啟動三個程序:
7.1.在第一個cmd中,啟動rmiregistry,注意要在遠(yuǎn)程實現(xiàn)類所在的目錄下運行;
7.2.在第二個cmd中,啟動服務(wù)器端程序;
注意點:a).java參數(shù)(-Djava.security.policy)中要指定策略文件名(包含路徑)
b).路徑中若目錄名里含有空格,須將整個路徑用""包起來,否則會報Class Not Found錯
c).如果機器上安裝有防火墻軟件,可能會導(dǎo)致connect超時,異常中斷,須關(guān)閉防火墻
7.3.在第三個cmd中,啟動客戶端程序;
8.下面介紹如何在eclipse中運行一個簡單的RMI程序:
8.1.先在eclipse里新建一個java項目,然后,創(chuàng)建RMI接口,實現(xiàn)類,服務(wù)器端程序,客戶端程序;
8.2.打開cmd窗口,啟動rmiregistry;
8.3.在eclipse里,右鍵點擊服務(wù)器端程序,打開“運行...”配置窗口,切換到“Arguments”,在“VM arguments”里輸入:-Djava.security.policy=xxxxxxx

8.4.點擊“運行”,在控制臺里可以看到服務(wù)器程序正確運行;
8.5.最后,右鍵點擊客戶端程序,運行;