在沒有RMI的情況下,我們使用普通的網(wǎng)絡(luò)傳輸技術(shù)能完成么?當(dāng)然,兩種選擇,Socket直接通訊,將參數(shù)傳給B,B在通過Socket返還給調(diào)用者。或者通過Servlet也可以遠(yuǎn)程調(diào)用阿。
那么這樣解決問題時沒有問題,但對于A和B來說,代碼量、程序復(fù)用程序、維護性都不會太理想。
如果能讓調(diào)用者不知道網(wǎng)絡(luò)操作,實現(xiàn)對于用戶透明,也就是像調(diào)用本地一樣,對象名.方法名。
那么就是RMI規(guī)范涉及到一些接口。
面向接口的編程方式,就可以達(dá)到代碼的實現(xiàn)與聲明分離。
這樣用戶就只關(guān)心接口了。很多細(xì)節(jié)讓遵守規(guī)范(也就是一些編寫好的工具)的實現(xiàn)類去完成吧。[就是Stub和Skeleton]
那么就先定一個用戶A要知道怎么用,B要知道方法簽名完成實現(xiàn),的同一接口吧。









兩點要求
1,繼承標(biāo)記接口Remote。
identify interfaces whose methods may be invoked from a non-local virtual machine.
標(biāo)識該接口可以被非本地VM調(diào)用唄。
2,里面每個方法都要拋出RemoteException
業(yè)務(wù)接口的實現(xiàn)類,也就是做實事的類


















=====================
javac *.class
rmic -keep ComputeImpl
帶參數(shù),可以保留Stub和Skeleton源碼。
通過ComputeImpl的實現(xiàn)類來生成負(fù)責(zé)通訊的Stub(存根)和Skeleton(框架)
======================
那么就是要把這個對象綁定到一個端口上。
以便別人來使用
編寫一個Server
















客戶端
















?看到?jīng)]有,客戶端通過rmi協(xié)議到服務(wù)器上尋找/compute資源對象。那個Naming是RMI專用,不是JNDI。
那么Server類并沒有負(fù)責(zé)監(jiān)聽阿。
哦,最后有一個強大的工具在JAVA_HOME/bin/下,叫做rmiregistry,專門負(fù)責(zé)監(jiān)聽固定端口上,rmi協(xié)議的請求。
=================
rmiregistry 8888
=================
啟動Server,綁定遠(yuǎn)程對象阿
java Server
=================
啟動一個Client,調(diào)用一下
java Client
=================

===============
另外一些小問題
由于rmiregistry 工具的不斷強大,jdk1.4已經(jīng)可以不再使用skeleton,到1.5,根本就不生成skeleton了。
rmiregistry可以充當(dāng)skeleton角色完成功能。
記住EJB中,還不行,因為沒有rmiregistry工具了。呵呵,明白了?
=========================
所以什么呢,RMI就是一種代理模式的應(yīng)用Stub,就是實際實現(xiàn)類的客戶代理。
但需要統(tǒng)一的接口,才能對于用戶、調(diào)用者透明啊!
------------------------
我說的比較通俗。還有很多深刻的東西。