Java RMI技術

5937 ワード

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を放出する
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();
		}
		
	}

}