1

RMIサービスとクライアントを正常に作成しました。メソッドなどを呼び出すことができます。しかし今、私は次のことを試してみたかったのです。LinkedListのような標準のJavaオブジェクトをサービスでホストしたかったのです。また、LinkedListを使用する既存のコードを「ふり」したかったのです。私が欲しいのは、実際にはサービスによって管理されているLinkedListを取得することですが、通常のLinkedListと同じようにローカルでアクセスできます。その上、.add()が呼び出された場合、サーバーに「Addcalled」と書き込むなど、最小限のロギングを実行したいと思います。

これは本番用ではなく、動作を理解するのに役立ちます。

これまで私はたくさんのことを試しました。最も有望なのは、LinkedListを拡張し、Remoteを実装するクラスを作成したことです。このクラスは、次のようにコンストラクターのレジストリに自分自身を登録しようとします。

try {

UnicastRemoteObject.exportObject((Remote)this); Naming.rebind("theList", (Remote)this); } catch (Exception e) { System.out.println("fail"); System.out.println(e.getMessage()); }

LinkedListを拡張する必要があるため、これを行う必要があります。したがって、UnicastRemoteObjectを拡張できません。

サーバー側でこれを実行しようとすると、次の出力が得られます。

不合格
ホストへの接続が拒否されました:192.168.178.27; ネストされた例外は次のとおりです。
 java.net.ConnectException:接続が拒否されました

そしてクライアント側では:

java.lang.ClassCastException:MyList_Stubをjava.util.LinkedListにキャストできません
 $ Proxy0.createList(不明なソース)
 RemoteProgram.main(RemoteProgram.java:27)で

前もって感謝します!

4

3 に答える 3

2

あなたがやろうとしていることは非常に非効率的であり、あまり良い考えではありません。基本的に、シリアル化できるメソッド呼び出しで何でも送信できます。優れたパフォーマンスが必要な場合は、サービスを表し、必要なすべてのサービスのファサードとして機能するリモートオブジェクトを1つだけ持つことをお勧めします(各リモートオブジェクトは個別のファイル記述子になるため、通常、リモートオブジェクトを多数持つことは良い考えではありません)。さらに、オブジェクトを頻繁に追加および削除する場合は、要素を追加または削除するたびにメッセージを送信することはあまり意味がありません。次の2つの非常に単純なメソッドを使用して単一のリモートオブジェクトを作成することをお勧めします。

LinkedList retrieveLinkedListByName(String);
boolean commitNewVersionOfLinkedListByName(String,LinkedList);

アプリケーションの起動時に、リンクリストをダウンロードできます。その後、定期的に、アプリケーションの終了時に、リンクリストを送り返すことができます。リンクリストに要素を追加または削除するたびにネットワークを使用するよりも効率的です。LinkedListの要素がシリアル化可能である限り、送信するために魔法をかける必要はありません(リモートを拡張するなど)。

于 2010-07-11T11:32:12.253 に答える
2
java.lang.ClassCastException: MyList_Stub cannot be cast to java.util.LinkedList
at $Proxy0.createList(Unknown Source)
at RemoteProgram.main(RemoteProgram.java:27)

LinkedListは具象クラスであり、RMIはインターフェースで動作するため、クライアント側でListインターフェースにキャストする必要があります。

于 2010-07-11T11:35:38.207 に答える
0

他のポスターと同じように、これは非常に非効率的なデザインです。

例外として、サーバーで「接続が拒否された」状態を維持し、クライアントを実行する方法がわかりません。スタックトレースを投稿する必要があります。

于 2010-07-12T06:43:31.440 に答える