Java RMIフレームワーク(リモートメソッド呼び出し)

4287 ワード

転載自51 CTO作者:xxxx 66 yyyy
RMI(Remote Method Invokeリモートメソッド呼び出し).Javaでは、java.rmi.Remoteインタフェースを持つクラスextendsが1つあれば、クライアントがアクセスし、一定のサービスを提供するためにサーバ側に存在するリモートオブジェクトになります.JavaDocの説明:Remoteインタフェースは、ローカル以外の仮想マシンから呼び出すことができるメソッドを識別するために使用されます.リモート・オブジェクトは、このインタフェースを直接または間接的に実装する必要があります.リモートで使用できるのは、Java.rmi.Remoteのインタフェースを拡張するリモートインタフェースで指定した方法のみです.注意:extendsがRemoteインタフェースのクラスまたは他のインタフェースのメソッドを宣言してRemoteException例外が投げ出された場合、このメソッドはクライアントのリモートアクセスによって呼び出される可能性があります.また、リモート・オブジェクトはjava.rmi.server.UniCastRemoteObjectクラスを実装する必要があります.これにより、クライアントがリモート・オブジェクトにアクセスして取得すると、そのリモート・オブジェクトが自身のコピーをSocket形式でクライアントに転送することが保証されます.このコピーは、クライアントが取得したコピーを「スタブ」と呼び、サーバ側自体がすでに存在するリモート・オブジェクトを「スケルトン」と呼びます.実はこのときのルートはクライアントのエージェントであり、サーバ側との通信に用いられるが、スケルトンはクライアント側のエージェントと考えられ、クライアントの要求を受信した後にリモートメソッドを呼び出してクライアントの要求に応答する.RMIフレームワークの基本原理は,エージェントモードを適用して,ローカルルートと実際のリモートオブジェクトとの通信の詳細をカプセル化する図である.[画像のアップロードに失敗しました...(image-abe 087-1511763008793)]
次に、IServiceインタフェースは、サーバ側が提供しなければならないサービス(すなわちサービス()メソッド)を宣言するために使用され、サービスインプリメンテーションクラスは特定のサービス実装クラスであり、サーバ側にスケルトンエージェントオブジェクトが存在してクライアントの要求に処理および応答するようにサーバリモートオブジェクトを登録することを最終的に担当する簡単なRMIアプリケーションを示す.[画像のアップロードに失敗しました...(image-537557-1511763008793)]
各クラスのソースコードは次のとおりです:IServiceインタフェース:
import java.rmi.Remote; 
import java.rmi.RemoteException; 
public interface IService extends Remote { 
  //              
  String service(String content) throws RemoteException; 
}

サービスインプリメンテーションクラス:
import java.rmi.RemoteException; 
//UnicastRemoteObject                       。 
import java.rmi.server.UnicastRemoteObject; 

public class ServiceImpl extends UnicastRemoteObject implements IService { 

  private String name; 

  public ServiceImpl(String name) throws RemoteException { 
    this.name = name; 
  } 
  @Override 
  public String service(String content) { 
    return "server >> " + content; 
  } 
}

Serverクラス:
/* 
* Context           ,              。 
*                  。 
*/ 
import javax.naming.Context; 
/* 
* InitialContext              。    
*          Context              。 
*/ 
import javax.naming.InitialContext; 
public class Server { 
  public static void main(String[] args) { 
    try { 
      //      IService       ServiceImpl   
      IService service02 = new ServiceImpl("service02"); 
      //        
      Context namingContext = new InitialContext(); 
      //        ,                     
      namingContext.rebind("rmi://localhost/service02", service02); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
    System.out.println("          1       !"); 
  } 
}

Clientクラス:
import javax.naming.Context; 
import javax.naming.InitialContext; 

public class Client { 
  public static void main(String[] args) { 
    String url = "rmi://localhost/"; 
    try { 
      Context namingContext = new InitialContext(); 
      //        。                   
      IService service02 = (IService) namingContext.lookup(url 
          + "service02"); 
      Class stubClass = service02.getClass(); 
      System.out.println(service02 + "   " + stubClass.getName() 
          + "    !"); 
      //                
      Class[] interfaces = stubClass.getInterfaces(); 
      for (Class c : interfaces) { 
        System.out.println("       " + c.getName() + "   !"); 
      } 
      System.out.println(service02.service("  !")); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
}

上記のコードをあるディレクトリに保存し、「start rmiregistry」を実行して、サーバクラスに登録されたリモートオブジェクトを保存し、リモートクライアントの要求アクセスを許可するJDK独自のレジストリプログラムを起動します.次に、サーバ側のサーバクラス、すなわち「start javaサーバ」を実行し、レジストリに特定のリモートオブジェクトを登録します.最後に、クライアント・プログラムを実行してサーバ側のリモート・オブジェクト・ルートを検索して取得します.この場合、ルート・オブジェクトを使用してサーバと通信できます.コマンドは「java Client」です.注意:上記のコマンドのstartの機能は、DOSウィンドウを再開することです.実行結果は以下の通りである:[ピクチャアップロード失敗...(image-50 c 82-151763008793)][ピクチャアップロード失敗...(image-4 d 34 da-11763008793)][ピクチャアップロード失敗...(image-456 df-11763008793)]
実は全体の简単なRMIアプリケーションの中で各クラスのインタラクティブなタイミングは下図のようです:[画像のアップロードに失败しました...(image-cdc 7 b 6-1511763008793)]
以上の内容は、孫衛琴先生の『Javaネットプログラミング精解』という本のRMIの章を参考にして、自分の個人的な理解の総括を加えて、みんなとお互いに勉強して共に進歩することを望んでいます.
転載自51 CTO作者:xxxx 66 yyyy