2011-01-21 41 views
2

我設法創建了一個RMI應用程序,它可以完成我所需要的操作,但是我的問題讓我頭腦不清,客戶端在哪裏獲取遠程對象的定義。例如:RMI問題 - 客戶端從哪裏獲得尚未添加到註冊表的遠程類的定義?

我有一個服務器註冊自己的rmiregistry(允許客戶端調用它的方法)。

UnicastRemoteObject.exportObject(new Server(), 0);

運行reg.list()確認我的服務器確實已被添加到註冊表中。我有另一個遠程對象(rObj)在與服務器相同的JVM上運行。這不會被添加到註冊表中。在此之後

reg.lookup("Server")

可以自由創建rObj的實例:

在我的客戶,我可以通過在rmiregistry中查找Server得到我的服務器類的定義。我的問題的癥結在於,我的客戶端從哪裏獲得rObj的定義,即使它從未添加到註冊表中。

我知道它必須來自服務器,因爲它是存儲類和接口的地方。與Server的連接是否會自動打開其他遠程類接收的管道?

如果是這樣,客戶端如何知道在服務器上查找遠程類。服務器幾乎是作爲客戶端類路徑的擴展(它將訴諸檢查服務器中不在其自己的類路徑中的類)?

+0

是rObj使用Server實例裏面:

-Djava.rmi.server.codebase=http://webline/public/mystuff.jar 

這是完全詳細解釋:然後用系統屬性表示URL到這個jar文件啓動客戶端?它是否從服務器的任何方法返回? – 2011-01-24 20:22:00

+0

它是一個服務器方法的參數,但它沒有被任何服務器方法返回 – richzilla 2011-01-24 20:26:11

回答

3

首先,意識到不必爲了使用RMI而從服務器設置動態類加載。如果您將接口和實現編譯到客戶端和服務器罐中,那麼一切都會正常工作。這就是我幾乎總是實施RMI的方式。

如果您有充分的理由從服務器動態加載類,則需要在具有接口和實現類的地方設置HTTP服務器(最好在jar文件中,儘管類目錄可以工作太)。這不會作爲RMI的一部分自動發生,您需要構建jar並將它們放在Web服務器上的某個位置。http://download.oracle.com/javase/1.5.0/docs/guide/rmi/codebase.html

1

如果使用new作爲rObj創建同一類型(比如,T)的新實例,那當然Java編譯器知道的T的定義,你的應用程序也知道它在運行時。在這種情況下,根本不涉及RMI。

但也許我誤解了你的問題?你如何「自由地創建rObj的實例」?

更新:我在這裏吃我的話,當然能夠編譯文件,並在運行時在類路徑上提供類或兩個不同的問題。因爲你根本沒有提及classpath,所以我假設你不知怎麼會最終在客戶端擁有類。