2011-05-16 27 views
0

我有一個討厭的問題,但首先讓我解釋一下上下文。Java RMI,一個界面在網絡服務器上發佈爲遠程,而它不應該是

該項目只是一個簡單的項目,所以我熟悉RMI。該項目是一個股票市場服務器和一個客戶端,用於從服務器獲取有關資金的數據。

我已經在3個java項目中劃分了項目。服務器(具有MockStockMarket和Fund),客戶端(具有GUI類和與服務器交談的類:BannerController)以及具有客戶端和服務器需要的接口(IStockMarket和IFund)的項目。

我希望我的bannerController與StockMarket交談,以便bannercontroller獲得資金。這是使用getFunds():ArrayList完成的。

正如你所看到的,StockMarket應該是遠程的,基金應該是可串行化的。

的問題是,由於某種原因,當我使用下面的代碼:

IStockMarket market = new MockStockMarket(); 
Naming.rebind("rmi://localhost/StockMarket", market); 

兩個IStockMarket(如預期)和iFund中(未如預期)成爲遙控器。這不是我想要的。

備案:基金實施IFund,它擴展了Serializable(所以沒有任何遠程),MockStockMarket擴展了UnicastRemoteObject並實現了擴展Remote的IStockMarket。

下面是Web服務器發佈兩個接口的屏幕截圖:http://imageshack.us/m/194/4755/rmibothinterfacespublis.png

對於索裏的代碼:https://rapidshare.com/files/2085773800/stockmarket.zip

回答

0

Oke我發現它在oracle網站上:http://download.oracle.com/javase/tutorial/rmi/implementing.html

網絡服務器正在發佈我的IFund(非遠程)接口,因爲它是通過RMI方法傳遞的。我的客戶需要IFund使用傳遞的對象。我認爲這對RMI來說足夠了。

我不知道的是客戶端ALSO需要下載類實現,以便它可以反序列化對象並使用複製對象的方法。爲此,您必須在客戶端使用安全管理員。這很容易:

if (System.getSecurityManager() == null) 
{ 
    System.setSecurityManager(new SecurityManager()); 
} 
+0

網絡服務器不是「發佈」任何東西。它從您的代碼庫位置*返回*,放置它的位置*,以響應由RMI代碼庫客戶端發出的GET請求。 – EJP 2011-05-18 00:48:14

+0

它正在發佈其他jvms的文件,以便從代碼庫下載它... – Rob 2011-05-18 08:59:11

+0

這就是*你*通過將它們放入代碼庫來發布文件。它們需要在那裏才能滿足遠程接口的類加載。這不像你有其他選擇。 – EJP 2011-05-20 00:59:43

1

綁定的RMI服務的端口是不是在Web服務器發佈的文件不同。您附加的屏幕截圖顯示您的IStockMarket.class和IFund.class文件是作爲HTTP資源公開的,這些資源與「綁定」RMI服務無關。如果我的解釋是錯誤的,請隨時在問題中添加更多詳細信息,我會嘗試回答它們。

+0

那麼,當我啓動我的服務器時,web服務器顯示我那兩個類是暴露的。但一個IFund不應該。另外,當客戶端獲得IFund對象時,它會嘗試將其用作遠程對象,而不僅僅是反序列化它。 – Rob 2011-05-16 19:12:01

1

這兩個IStockMarket(如預期的)和 IFund(不是預期的)變得遙遠。

不,他們沒有。對象僅通過導出而變得「遙遠」,並且接口根本不「變得遙遠」。 IFund是客戶需要的,大概是因爲它出現在IStockMarket界面。您似乎正在使用代碼庫功能。從代碼庫的角度來看,Registry也是一個客戶端。所以註冊表下載了IFund.class和IStockMarket.class。這不會讓IFund以任何形式或形式變得「遙遠」。

相關問題