1

RMI は初めてです

この例を試しました。これは期待どおりに機能します。

Calculator.class
CalculatorImpl.class + CalculatorImpl_Stub.class
CalculatorServer.class
+
CalculatorClient.class

実際、2 台の異なる PC でテストする予定です。しかし、その代わりに、同じ PC の2 つの異なるフォルダーで試してみました。

1 つのフォルダーにサーバーが含まれます:
Calculator.class :interface
CalculatorImpl.class + CalculatorImpl_Stub.class
CalculatorServer.class

もう 1 つのフォルダには、Client:
Calculator.class が含まれています。これは、CalculatorClient.class の上の Server の Calculatorインターフェースの単なるコピーです。

実行しようとすると サーバーは正常に動作しています

クライアントを実行すると、このエラーが出力されました:

java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
        java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security manag
er: RMI class loader disabled)
        at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
        at java.rmi.Naming.lookup(Unknown Source)
        at CalculatorClient.main(CalculatorClient.java:12)
Caused by: java.lang.ClassNotFoundException: CalculatorImpl_Stub (no security ma
nager: RMI class loader disabled)
        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
        at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
        at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
        at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
        at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
        at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
        at java.io.ObjectInputStream.readClassDesc(Unknown Source)
        at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        ... 3 more
  • それらは同じフォルダーでうまく機能します。
  • 2 つの異なるフォルダーにある場合のエラー。

なんで?
このエラーを回避するにはどうすればよいですか?

4

3 に答える 3

1

例外で指定されたクラスは、クライアントの CLASSPATH で使用できません。だからそれを修正してください。リモート スタブとインターフェイス、およびそれらが依存するすべてのものは、クライアントに配布する必要があります。

于 2013-02-28T11:11:00.363 に答える
1

主な問題は、非常に時代遅れの RMI の例に従っていることです。ここにヒントがあります。RMI の例にrmic(またはスタブとスケルトン) の使用が含まれている場合は、使用しないでください。sun/oracle tutorialから始めることをお勧めします。

于 2013-02-28T16:02:34.617 に答える
0

この問題の最も一般的な理由は、UnicastRemoteObject. exportObject(リモート obj) . ドキュメントから、 のインスタンスを返すことがわかります。RemoteStubそのため、スタブ クラスが利用可能である必要があります。これは、 で生成した場合にのみ可能ですrmic

UnicastRemoteObject.exportObject(Remote obj, int port)代わりに使用してください。インターフェイス ( Remote) を返し、最近のリリースでは生成されたクラスがなくても機能します。

于 2013-02-28T16:11:35.350 に答える