Java RMI技術
JAva rmiすなわちjavaリモートインタフェース呼び出しは、2台の仮想マシン間のプログラム呼び出しを実現し、ネットワーク上の任意の2台のコンピュータが互いに相手のプログラムを呼び出すことができる(許可されている場合).
では、古典的なHello worldを例に説明します.rmiを開発する手順は以下の通りです.
1、リモートインタフェースを作成し、リモートインタフェース実現クラス
2、コンパイル
3、インタフェースを生成してクラスのルートを実現する
4、サーバー側でrmiregistryコマンドを起動する
5、サービス側にリモートオブジェクトを登録する
6、クライアントでリモートオブジェクトを取得する
例:
以下のリモートインタフェースクラスはHelloRemoteであり、実装クラスはHelloImplであり、サーバ側のパブリケーションクラスはRMIServerであり、クライアントの呼び出しクラスはRMIClientであり、簡単に考えると、サーバとクライアントは同じマシン(サーバとクライアントとは、両方が2つのダミーマシンプロセスで実行される)である.
一、編纂クラス
1、リモートインタフェースクラス、基礎java.rmi.Remoteインタフェースが必要で、しかも方法はRMIExceptionを放出する
2、リモートインタフェース実装クラス、UnicastRemoteObjectを継承する必要がある
3、サービス側クラス
サービス・エンド・クラスは、リモート・オブジェクトをパブリッシュするために使用されます.
4、クライアントクラス
リモートインタフェースクラスは、サービス側とクライアントの両方に存在する必要があります.
二、コンパイル(以上のクラスにはパッケージがないことに注意し、ここでは主に操作の簡略化を考慮する)
クライアントフォルダはE:/client(clientと略称)、サービス側はE:/server(serverと略称)
以上の4つのファイルをそれぞれコンパイルします.それからHello.classをそれぞれclientとserverの下に置いて、Client.classをclientの下に置いて、Server.classはserverの下に置いて、HelloImpl.classファイルはserverフォルダの下に置きます
三、スタブとスケルトンの生成
serverフォルダに入り、コマンドラインの下にコマンドrmic HelloImplを入力すると、HelloImpl_が生成されます.Stub.classファイル
このファイルをclientディレクトリにコピー(serverとclientは両方)
四、
レジストリプログラムの実行
コマンドラインでserverフォルダに入るコマンドrmiregistryを入力して登録を開始します.その前にclasspathをE:/serverに設定する必要があります.rmiregistryコマンドを入力するとserverフォルダの下に1つのコマンドが生成されます.
五、運行サービス類
java Server
六、顧客クラスの実行
java Client
実行に成功したことがわかります.
うまくいかない場合は、次を見てください.
1、最終実行時に3つのコマンドラインウィンドウが必要で、1つはrmiregistryを実行して、1つはServerを実行して、1つはClinetを実行して、先にrmiregistryコマンドを実行して、それからjava Serverを実行して、最後にjava Clientを実行します
2、クライアントとサービス側は、ルート(HelloImpl_Stub.class)とリモートインタフェースの定義があり、パッケージ名が一致している必要があります.
3、サーバーを実行する時、ヒントが見つからないHelloImpl_Stubクラスパスを指定していませんrmiregistryを実行する前にclasspathを設定してください
4、アクセス不正が発生した場合、この略ファイルを修正し、jre/securityディレクトリの下のjava.policyファイル(複数のjreがある場合、どれなのか分からない.すべて変更しましょう)に、次の内容を追加します.
grant {
permission java.net.SocketPermission "*:1024-65535",
"connect,accept";
permission java.net.SocketPermission "*:80","connect";
};
5、ポートを指定します.デフォルトは1099です.rmiregistryを実行するときにrmiregistry 1098のように指定するか、RegistryのようにServer.javaで指定できます.
createRegistry(1088).
6、バインドアドレスの設定
簡単な形式Naming.bind(「hello」)は、ネイティブアドレスの場合にのみ使用できます.
完全形式Naming.bind(「rmi://117.45.220.11:1099/RMI_Hello")
では、古典的なHello worldを例に説明します.rmiを開発する手順は以下の通りです.
1、リモートインタフェースを作成し、リモートインタフェース実現クラス
2、コンパイル
3、インタフェースを生成してクラスのルートを実現する
4、サーバー側でrmiregistryコマンドを起動する
5、サービス側にリモートオブジェクトを登録する
6、クライアントでリモートオブジェクトを取得する
例:
以下のリモートインタフェースクラスはHelloRemoteであり、実装クラスはHelloImplであり、サーバ側のパブリケーションクラスはRMIServerであり、クライアントの呼び出しクラスはRMIClientであり、簡単に考えると、サーバとクライアントは同じマシン(サーバとクライアントとは、両方が2つのダミーマシンプロセスで実行される)である.
一、編纂クラス
1、リモートインタフェースクラス、基礎java.rmi.Remoteインタフェースが必要で、しかも方法はRMIExceptionを放出する
public interface HelloRemote extends Remote{
public void sayHello() throws RemoteException;
}
2、リモートインタフェース実装クラス、UnicastRemoteObjectを継承する必要がある
public class HelloImpl extends UnicastRemoteObject implements HelloRemote{
public HelloImpl() throws RemoteException {
super();
}
public void sayHello() throws RemoteException {
System.out.println("Hello World!");
}
}
3、サービス側クラス
サービス・エンド・クラスは、リモート・オブジェクトをパブリッシュするために使用されます.
public class RMIServer {
public static void main(String[] args) throws RemoteException, MalformedURLException {
HelloRemote hello=new HelloImpl();
Naming.rebind("hello", hello);
}
}
4、クライアントクラス
public class RMIClient {
public static void main(String args[]) throws MalformedURLException, RemoteException, NotBoundException{
System.setSecurityManager(new RMISecurityManager());//
HelloRemote hello=(HelloRemote) Naming.lookup("hello");
hello.sayHello();
}
}
リモートインタフェースクラスは、サービス側とクライアントの両方に存在する必要があります.
二、コンパイル(以上のクラスにはパッケージがないことに注意し、ここでは主に操作の簡略化を考慮する)
クライアントフォルダはE:/client(clientと略称)、サービス側はE:/server(serverと略称)
以上の4つのファイルをそれぞれコンパイルします.それからHello.classをそれぞれclientとserverの下に置いて、Client.classをclientの下に置いて、Server.classはserverの下に置いて、HelloImpl.classファイルはserverフォルダの下に置きます
三、スタブとスケルトンの生成
serverフォルダに入り、コマンドラインの下にコマンドrmic HelloImplを入力すると、HelloImpl_が生成されます.Stub.classファイル
このファイルをclientディレクトリにコピー(serverとclientは両方)
四、
レジストリプログラムの実行
コマンドラインでserverフォルダに入るコマンドrmiregistryを入力して登録を開始します.その前にclasspathをE:/serverに設定する必要があります.rmiregistryコマンドを入力するとserverフォルダの下に1つのコマンドが生成されます.
五、運行サービス類
java Server
六、顧客クラスの実行
java Client
実行に成功したことがわかります.
うまくいかない場合は、次を見てください.
1、最終実行時に3つのコマンドラインウィンドウが必要で、1つはrmiregistryを実行して、1つはServerを実行して、1つはClinetを実行して、先にrmiregistryコマンドを実行して、それからjava Serverを実行して、最後にjava Clientを実行します
2、クライアントとサービス側は、ルート(HelloImpl_Stub.class)とリモートインタフェースの定義があり、パッケージ名が一致している必要があります.
3、サーバーを実行する時、ヒントが見つからないHelloImpl_Stubクラスパスを指定していませんrmiregistryを実行する前にclasspathを設定してください
4、アクセス不正が発生した場合、この略ファイルを修正し、jre/securityディレクトリの下のjava.policyファイル(複数のjreがある場合、どれなのか分からない.すべて変更しましょう)に、次の内容を追加します.
grant {
permission java.net.SocketPermission "*:1024-65535",
"connect,accept";
permission java.net.SocketPermission "*:80","connect";
};
5、ポートを指定します.デフォルトは1099です.rmiregistryを実行するときにrmiregistry 1098のように指定するか、RegistryのようにServer.javaで指定できます.
createRegistry(1088).
6、バインドアドレスの設定
簡単な形式Naming.bind(「hello」)は、ネイティブアドレスの場合にのみ使用できます.
完全形式Naming.bind(「rmi://117.45.220.11:1099/RMI_Hello")
package RMITest;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Example extends Remote {
public void setString( String s ) throws RemoteException;
public String getString() throws RemoteException;
}
package RMITest;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ExampleServer extends UnicastRemoteObject implements Example {
private String stringState;
public ExampleServer() throws RemoteException {}
@Override
public void setString(String s) throws RemoteException {
// TODO Auto-generated method stub
stringState = s;
}
@Override
public String getString() throws RemoteException {
// TODO Auto-generated method stub
return stringState;
}
}
import java.rmi.registry.LocateRegistry;
public class Server {
/**
* @param args
* @throws MalformedURLException
* @throws RemoteException
*/
public static void main(String[] args) throws RemoteException, MalformedURLException {
// TODO Auto-generated method stub
LocateRegistry.createRegistry(8889);
ExampleServer es = new ExampleServer();
Naming.rebind("rmi://localhost:8889/Example", es);
}
}
package RMITest;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class ExampleClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Example example = (Example) Naming.lookup("rmi://localhost:8889/Example");
example.setString("success");
System.out.println(example.getString());
} catch (MalformedURLException | RemoteException | NotBoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}