0

厄介な問題を抱えていますが、まずコンテキストを説明させてください。

このプロジェクトは単純なプロジェクトなので、RMI に慣れることができます。このプロジェクトは、株式市場サーバーと、サーバーから資金に関するデータを取得するクライアントです。

プロジェクトを 3 つの Java プロジェクトに分割しました。サーバー (MockStockMarket と Fund を持つ)、クライアント (GUI クラスとサーバーと対話するクラス: BannerController を持つ)、およびクライアントとサーバーの両方が必要とするインターフェース (IMStockMarket と IFund) を持つプロジェクト。

bannerController が StockMarket と通信して、bannercontroller が資金を取得できるようにします。これは getFunds() : ArrayList を使用して行われます。

ご覧のとおり、StockMarket は Remote で、Fund は Serializable である必要があります。

問題は、何らかの理由で次のコードを使用する場合です。

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

IStockMarket (意図したとおり) と IFund (意図したとおりではない) の両方がリモートになります。これは私が望むものではありません。

記録のために: Fund は Serializable を拡張する IFund を実装し (リモートは何もない)、MockStockMarket は UnicastRemoteObject を拡張し、Remote を拡張する IStockMarket を実装します。

両方のインターフェイスを公開する Web サーバーのスクリーンショットを次に示します: http://imageshack.us/m/194/4755/rboothinterfacespublis.png

ソース コード: https://rapidshare.com/files/2085773800/stockmarket.zip

4

3 に答える 3

1

IStockMarket (意図したとおり) と IFund (意図したとおりではない) の両方がリモートになります。

いいえ、そうではありません。オブジェクトはエクスポートされることによってのみ「リモートになる」だけであり、インターフェースは「リモートになる」ことはまったくありません。おそらく IStockMarket インターフェイスに表示されるため、IFund はクライアントによって必要とされます。コードベース機能を使用しているようです。コードベースの観点からは、レジストリもクライアントです。そのため、レジストリは IFund.class と IStockMarket.class をダウンロードしました。だからといって、IFund が何らかの形で「リモートになる」わけではありません。

于 2011-05-17T01:45:51.003 に答える
1

RMI サービスをポートにバインドすることは、ファイルを公開する Web サーバーとは異なります。添付したスクリーンショットは、 IStockMarket.class および IFund.class ファイルが RMI サービスの「バインド」とは関係のない HTTP リソースとして公開されていることを示しています。ここで私の解釈が間違っている場合は、質問に詳細を追加してください。回答してみます。

于 2011-05-16T16:16:19.163 に答える
0

オケオラクルサイトで見つけました:http://download.oracle.com/javase/tutorial/rmi/implementing.html

Web サーバーは、RMI メソッドを介して渡されるため、IFund (非リモート) インターフェイスを公開しています。私のクライアントは、渡されたオブジェクトを使用するために IFund を必要とします。RMIが機能するにはこれで十分だと思いました。

私が知らなかったのは、クライアントもクラス実装をダウンロードして、オブジェクトを逆シリアル化し、コピーされたオブジェクトのメソッドを使用できるようにする必要があるということです。これを機能させるには、クライアント側で securitymanager を使用する必要があります。これは非常に簡単です:

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