私はJava RMIを初めて使用します。実際にrmicを作成、コンパイル、開始し、サーバーを起動しようとしましたが、_stub 'ClassNotFound'例外が原因で失敗しました.....私はJava 7を使用しています...私はたくさん検索しましたグーグルですが、うまくいく可能性のあるステップバイステップの例を誰も教えてくれませんでした...コードベースとセキュリティポリシーの設定についていくつかのアイデアがありましたが、それを行う方法についての明確な提案はありません..コマンドラインを含む手順を教えてください..... .....お願いします...サーバーの起動方法と、コードベースやポリシー設定などの必要な設定を教えてください...ありがとう
2 に答える
を使用する必要はありませんrmic
。代わりに、サーバー オブジェクトを作成しexportObject()
、ポート パラメーターを持つメソッド オーバーロードの 1 つを呼び出します。例えば、
MyRemoteIntf stub = UnicastRemoteObject.exportObject(server, 0);
これにより、RMI は自動的にスタブを生成します。(ドキュメントはこの点で恐ろしく不明確です。port パラメーターを指定せずにバージョンを使用すると、rmic
自動的に生成される代わりに、生成された古いスタブのみが使用されます。)
また、リモート インターフェイスがレジストリとクライアントの両方のコードベースにあることを確認してください。これを適切に行わないと、さまざまなエラーが発生します。これは、Stackoverflow ですでに何度も回答されています。「rmi ClassNotFoundException」を検索してください。
rmic
Java (J2SE) 5.0 以降、スタブは実行時に動的に生成されるため、このコマンドを使用する必要はありません。
以下は、RMI の使用方法の基本的なステップバイステップの例です。
最初に、クライアントが表示および実行できる内容を定義する Remote インターフェイスを定義します。
public interface FooService extends Remote {
// Don't forget to add throws RemoteException.
public void bar() throws RemoteException;
}
注:メソッド宣言に追加しないthrows RemoteException
と、次の例外が発生します。
java.lang.IllegalArgumentException: illegal remote method encountered: public abstract void RMIExample.FooService.bar()
クライアントができることを定義したら、サーバー スライドでメソッドの具体的な実装を定義する必要があります。
public class FooServiceImpl extends UnicastRemoteObject implements FooService {
public FooServiceImpl() throws RemoteException {
super();
}
public void bar() {
System.out.println("I was remotely invoked!");
}
}
実装クラスは、前に定義した Remote インターフェースを継承しUnicastRemoteObject
て実装する必要があり、クラスには RemoteException をスローするコンストラクターが必要です。
リモート機能を完全に定義したので、実装オブジェクトをサーバー側の URL にバインドする必要があります。
// 4000 is the port to listen on.
LocateRegistry.createRegistry(4000);
Naming.rebind("//127.0.0.1:4000/foobar", new FooServiceImpl());
サーバーを起動して実行したので、クライアント側にスタブ インスタンス (別名プロキシ) が必要です。
FooService fooService =
(FooService)Naming.lookup("//127.0.0.1:4000/foobar");
最後にリモート メソッドを呼び出します。
fooService.bar();
サーバー側で次のように出力する必要があります。
I was remotely invoked!
参考文献:
http://en.wikipedia.org/wiki/Java_remote_method_invocation http://docs.oracle.com/javase/1.5.0/docs/guide/rmi/relnotes.html