注記:
java.rmi パッケージ : リモート メソッド呼び出し (RMI) は Java 9 以降のバージョンでは非推奨となり、Web サービスやリモート プロシージャ コール (RPC) などの他のリモート通信メカニズムが優先されます。
リモート メソッド呼び出し (RMI) は、オブジェクトが別のアドレス空間 (同じマシン上またはリモート マシン上にある可能性があります) に存在するオブジェクトのメソッドを呼び出すことを可能にする API です。 RMI を介して、コンピュータ (クライアント側) 上に存在する JVM で実行されているオブジェクトは、別の JVM (サーバー側) に存在するオブジェクトのメソッドを呼び出すことができます。 RMI は、サーバー オブジェクトでの単純なメソッド呼び出しを通じてクライアントとサーバー側の通信を可能にするパブリック リモート サーバー オブジェクトを作成します。
スタブオブジェクト: クライアント マシン上のスタブ オブジェクトは情報ブロックを構築し、この情報をサーバーに送信します。
ブロックは次のもので構成されます
- 使用するリモートオブジェクトの識別子
- 呼び出されるメソッド名
- リモート JVM へのパラメータ
スケルトンオブジェクト: スケルトン オブジェクトは、スタブ オブジェクトからのリクエストをリモート オブジェクトに渡します。次のタスクを実行します
- サーバー上に存在する実際のオブジェクトで目的のメソッドを呼び出します。
- スタブ オブジェクトから受け取ったパラメータをメソッドに転送します。
RMIの働き
クライアントとサーバー間の通信は、スタブ オブジェクト (クライアント側) とスケルトン オブジェクト (サーバー側) という 2 つの中間オブジェクトを使用して処理されます。これは、以下のメディアからも示されています。
以下に定義されているインターフェイスを実装するには、次の手順を順番に実行する必要があります。
- リモートインターフェースの定義
- リモートインターフェースの実装
- rmic (RMI コンパイラ) を使用した実装クラスからのスタブ オブジェクトとスケルトン オブジェクトの作成
- rmiレジストリを開始する
- サーバーアプリケーションプログラムの作成と実行
- クライアントアプリケーションプログラムを作成して実行します。
ステップ 1: リモート インターフェイスの定義
最初に行うことは、リモート クライアントが呼び出すことができるメソッドの説明を提供するインターフェイスを作成することです。このインターフェイスは Remote インターフェイスを拡張する必要があり、インターフェイス内のメソッド プロトタイプは RemoteException をスローする必要があります。
例:
ジャワ
vlc ダウンロード youtube
// Creating a Search interface> import> java.rmi.*;> public> interface> Search> extends> Remote> {> > // Declaring the method prototype> > public> String query(String search)> throws> RemoteException;> }> |
Java配列動的
>
>
ステップ 2: リモート インターフェイスの実装
次のステップは、リモート インターフェイスを実装することです。リモート インターフェイスを実装するには、クラスを java.rmi パッケージの UnicastRemoteObject クラスに拡張する必要があります。また、クラス内の親コンストラクターから java.rmi.RemoteException をスローするには、デフォルトのコンストラクターを作成する必要があります。
ジャワ
// Java program to implement the Search interface> import> java.rmi.*;> import> java.rmi.server.*;> public> class> SearchQuery> extends> UnicastRemoteObject> > implements> Search> {> > // Default constructor to throw RemoteException> > // from its parent constructor> > SearchQuery()> throws> RemoteException> > {> > super> ();> > }> > // Implementation of the query interface> > public> String query(String search)> > throws> RemoteException> > {> > String result;> > if> (search.equals(> 'Reflection in Java'> ))> > result => 'Found'> ;> > else> > result => 'Not Found'> ;> > return> result;> > }> }> |
>
比較可能なリスト
>
ステップ 3: rmic を使用して実装クラスからスタブ オブジェクトとスケルトン オブジェクトを作成する
rmic ツールは、スタブ オブジェクトとスケルトン オブジェクトを作成する rmi コンパイラを呼び出すために使用されます。そのプロトタイプは rmic クラス名です。上記のプログラムでは、コマンド プロンプトで次のコマンドを実行する必要があります。
rmic SearchQuery。
ステップ 4: rmiregistry を開始する
コマンド プロンプトで次のコマンドを発行して、レジストリ サービスを開始します。 start rmiregistry
ステップ 5: サーバー アプリケーション プログラムを作成して実行する
次のステップでは、サーバー アプリケーション プログラムを作成し、別のコマンド プロンプトで実行します。
- サーバー プログラムは、LocateRegistry クラスの createRegistry メソッドを使用して、引数として渡されたポート番号を使用してサーバー JVM 内に rmiregistry を作成します。
- Naming クラスの rebind メソッドは、リモート オブジェクトを新しい名前にバインドするために使用されます。
ジャワ
// Java program for server application> import> java.rmi.*;> import> java.rmi.registry.*;> public> class> SearchServer> {> > public> static> void> main(String args[])> > {> > try> > {> > // Create an object of the interface> > // implementation class> > Search obj => new> SearchQuery();> > // rmiregistry within the server JVM with> > // port number 1900> > LocateRegistry.createRegistry(> 1900> );> > // Binds the remote object by the name> > // geeksforgeeks> > Naming.rebind(> ' rmi://localhost:1900 '> +> > '/geeksforgeeks'> ,obj);> > }> > catch> (Exception ae)> > {> > System.out.println(ae);> > }> > }> }> |
>
>
ステップ 6: クライアント アプリケーション プログラムを作成して実行する
最後のステップでは、クライアント アプリケーション プログラムを作成し、別のコマンド プロンプトで実行します。 Naming クラスの lookup メソッドは、Stub オブジェクトの参照を取得するために使用されます。
str を int に変換する
ジャワ
// Java program for client application> import> java.rmi.*;> public> class> ClientRequest> {> > public> static> void> main(String args[])> > {> > String answer,value=> 'Reflection in Java'> ;> > try> > {> > // lookup method to find reference of remote object> > Search access => > (Search)Naming.lookup(> ' rmi://localhost:1900 '> +> > '/geeksforgeeks'> );> > answer = access.query(value);> > System.out.println(> 'Article on '> + value +> > ' '> + answer+> ' at techcodeview.com'> );> > }> > catch> (Exception ae)> > {> > System.out.println(ae);> > }> > }> }> |
>
>
注記: 上記のクライアントとサーバーのプログラムは同じマシン上で実行されるため、localhost が使用されます。別のマシンからリモート オブジェクトにアクセスするには、localhost をリモート オブジェクトが存在する IP アドレスに置き換える必要があります。
クラス名ごとにファイルをそれぞれ保存します
Search.java、SearchQuery.java、SearchServer.java、および ClientRequest.java
重要な所見:
- RMI は、リモート プロシージャ コール (RPC) に対する純粋な Java ソリューションであり、Java で分散アプリケーションを作成するために使用されます。
- スタブ オブジェクトとスケルトン オブジェクトは、クライアントとサーバー側の間の通信に使用されます。