リモートメソッド呼び出し(Rmi)は、同じマシン上またはリモートマシン上にある可能性のある別のアドレス空間に存在するオブジェクトに対して、オブジェクトがメソッドを呼び出すことを可能にするAPIです。 RMIを使用すると、コンピュータ(クライアント側)に存在するJVMで実行されているオブジェクトは、別のJVM(サーバー側)に存在するオブジェクトのメソッ RMIは、サーバーオブジェクト上の単純なメソッド呼び出しを介してクライアント側とサーバー側の通信を可能にするパブリックリモートサーバオブジェクトを作成します。
RMIの動作
クライアントとサーバーの間の通信は、スタブオブジェクト(クライアント側)とスケルトンオブジェクト(サーバー側)の二つの中間オブジェクトを使
スタブオブジェクト
クライアントマシン上のスタブオブジェクトは、情報ブロックを構築し、この情報をサーバーに送信します。 ブロックは次のもので構成されます
- 使用されるリモートオブジェクトの識別子
- 呼び出されるメソッド名
- リモートJVMへのパラメータ
スケルトンオブジェクト
スケルトンオブジェクトは、スタブオブジェクトからリモートオブジェクトに要求を渡します。 次のタスクを実行します
- サーバー上に存在する実際のオブジェクトで目的のメソッドを呼び出します。
- スタブオブジェクトから受け取ったパラメータをメソッドに転送します。
インターフェイスを実装する手順
- リモートインターフェイスの定義
- リモートインターフェイスの実装
- rmic(rmi complier)を使用した実装クラスからのスタブおよクライアントアプリケーションプログラム。
ステップ1: リモートインターフェイスの定義
まず、リモートクライアントが呼び出すことができるメソッドの説明を提供するインターフェイスを作成します。 このインターフェイスはリモートインターフェイスを拡張し、インターフェイス内のメソッドプロトタイプはRemoteExceptionをスローする必要があります。
import
java.rmi.*;
public
interface
Search
extends
Remote
{
public
String query(String search)
throws
RemoteException;
}
ステップ2:リモートインタフェースの実装
次のステップは、リモートインタフェースを実装することです。 リモートインターフェイスを実装するには、クラスは、javaのUnicastRemoteObjectクラスに拡張する必要があります。rmiパッケージ。 また、javaをスローするには、デフォルトコンストラクタを作成する必要があります。rmiクラス内の親コンストラクターからのRemoteException。
import
java.rmi.*;
import
java.rmi.server.*;
public
class
SearchQuery
extends
UnicastRemoteObject
implements
Search
{
SearchQuery()
throws
RemoteException
{
super
();
}
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ツールを使用して、スタブおよびスケルトン-オブジェクト そのプロトタイプは
rmic classnameです。 上記のプログラムの場合、次のコマンドをコマンドプロンプトで実行する必要があります
rmic SearchQuery
ステップ4:rmiregistryを起動する
コマンドプロンプトで次のコマンドを発行してレジストリサービスを起動するrmiregistryを起動する
ステップ5:サーバーアプリケーションプログラムを作成して実行する
次のステップは、サーバーアプリケーションプログラムを作成し、別のコマンドプロンプトで実行することです。
- サーバープログラムは、LocateRegistryクラスのcreateRegistryメソッドを使用して、引数として渡されたポート番号を使用してサーバー JVM内にrmiregistryを作成します。
- Namingクラスのrebindメソッドは、リモートオブジェクトを新しい名前にバインドするために使用されます。
import
java.rmi.*;
import
java.rmi.registry.*;
public
class
SearchServer
{
public
static
void
main(String args)
{
try
{
Search obj =
new
SearchQuery();
LocateRegistry.createRegistry(
1900
);
Naming.rebind(
"rmi://localhost:1900"
+
"/geeksforgeeks"
,obj);
}
catch
(Exception ae)
{
System.out.println(ae);
}
}
}
手順6:クライアントアプリケーションプログラムの作成と実行
最後の手順は、クライアントアプリケーションプログラムを作成し、別のコマンドプロンプトで実行することです。名前付けクラスのlookupメソッドは、スタブオブジェクトの参照を取得するために使用されます。
import
java.rmi.*;
public
class
ClientRequest
{
public
static
void
main(String args)
{
String answer,value=
"Reflection in Java"
;
try
{
Search access =
(Search)Naming.lookup(
"rmi://localhost:1900"
+
"/geeksforgeeks"
);
answer = access.query(value);
System.out.println(
"Article on "
+ value +
" "
+ answer+
" at GeeksforGeeks"
);
}
catch
(Exception ae)
{
System.out.println(ae);
}
}
}
注:上記のクライアントとサーバープログラムは同じマシン上で実行されるため、localhostが使用されます。 別のマシンからリモートオブジェクトにアクセスするには、localhostをリモートオブジェクトが存在するIPアドレスに置き換えます。
重要な観測:
- RMIはリモートプロシージャコール(RPC)に対する純粋なjavaソリューションであり、javaで分散アプリケーションを作成するために使用されます。
- スタブとスケルトンオブジェクトは、クライアント側とサーバー側の間の通信に使用されます。
この記事はAakash Ojhaによって寄稿されています。 あなたはGeeksforGeeksが好きで、貢献したい場合は、また、記事を書いて、あなたの記事を郵送することができます[email protected]メインページに表示されるあなたの記事を参照してくださいし、他のオタクを助けます。