0

我遇到了一个讨厌的问题,但首先让我解释一下上下文。

该项目只是一个简单的项目,所以我熟悉 RMI。该项目是一个股票市场服务器和一个从服务器中提取资金数据的客户端。

我已将项目分为 3 个 java 项目。服务器(具有 MockStockMarket 和 Fund)、客户端(具有 GUI 类和一个与服务器对话的类:BannerController)以及具有客户端和服务器都需要的接口(IStockMarket 和 IFund)的项目。

我希望我的bannerController 与StockMarket 对话,以便bannercontroller 获得资金。这是使用 getFunds() 完成的:ArrayList。

如您所见,StockMarket 应该是 Remote,而 Fund 应该是 Serializable。

问题是,由于某种原因,当我使用以下代码时:

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

IStockMarket(如预期)和 I Fund(未如预期)都变得远程。这不是我想要的。

记录一下:Fund 实现了 IFund,它扩展了 Serializable(所以没有远程),MockStockMarket 扩展了 UnicastRemoteObject 并实现了 IStockMarket,它扩展了 Remote。

这是发布这两个界面的 Web 服务器的屏幕截图:http: //imageshack.us/m/194/4755/rmiothinterfacespublis.png

源代码: https ://rapidshare.com/files/2085773800/stockmarket.zip

4

3 回答 3

1

将 RMI 服务绑定到端口不同于 Web 服务器发布文件。您所附的屏幕截图显示您的 IStockMarket.class 和 IFund.class 文件作为 HTTP 资源公开,与“绑定”RMI 服务没有任何关系。如果我在这里的解释有误,请随时为问题添加更多细节,我会尝试回答。

于 2011-05-16T16:16:19.163 回答
1

IStockMarket(如预期)和 I Fund(未如预期)都变得远程。

不,他们没有。对象仅通过导出而“变得远程”,而接口根本不会“变得远程”。客户需要 IFund,大概是因为它出现在 IStockMarket 界面中。您似乎正在使用代码库功能。从代码库的角度来看,Registry 也是一个客户端。因此注册中心下载了 I Fund.class 和 IStockMarket.class。这不会使 IFund 以任何形式或形式“变得遥远”。

于 2011-05-17T01:45:51.003 回答
0

好吧,我在 oracle 网站上找到了它:http: //download.oracle.com/javase/tutorial/rmi/implementing.html

网络服务器正在发布我的 IFund(非远程)接口,因为它是通过 RMI 方法传递的。我的客户需要 IFund 才能使用传递的对象。我认为这足以让 RMI 工作。

我不知道的是客户端还需要下载类实现,以便它可以反序列化对象并使用复制对象的方法。为此,您必须在客户端使用安全管理器。这很容易:

if (System.getSecurityManager() == null) 
{
    System.setSecurityManager(new SecurityManager());
}
于 2011-05-17T18:55:22.743 回答