目次|| Java Remote Method Invocation


3.5プロキシ経由でファイアウォールを通過するRMI

RMIのトランスポート層は通常、インターネット上のホストへ直接ソケットを開こうとします。しかし、多くのイントラネットはファイアウォールを備えているためこれができません。このため、デフォルトのRMIトランスポートでは、これに代わる2種類のHTTPベースのメカニズムを備えて、ファイアウォールの内側にあるクライアントが、ファイアウォールの外側にあるリモート・オブジェクト上のメソッドを呼び出せるようにしています。

このセクションで説明したように、HTTPベースのメカニズムは、RMIのトランスポート層がRMI呼出しに使用するもので、HTTPプロキシ・サーバーによるファイアウォールだけに適用されます。


3.5.1 RMI呼出しはHTTPプロトコルの中でどのようにパッケージされるか

ファイアウォールの外側に到達できるように、トランスポート層はファイアウォール信任HTTPプロトコルに、RMI呼出しを埋め込んでおきます。RMI呼出しのデータは、HTTP POST要求の本体として外側へ送り出され、返される情報もHTTPによる応答本体の一部として組み込まれています。トランスポート層は、POST要求の形式を次の2つのどれかの方法で整えます。

3.5.2デフォルト・ソケット・ファクトリ

RMIトランスポートの実装には、java.rmi.server.RMISocketFactoryクラスの拡張が含まれます。このクラスは、クライアント・ソケットおよびサーバー・ソケットがRMI呼出しを送受信するために使用する、デフォルトのリソース・プロバイダです。このデフォルト・ソケット・ファクトリは、ava.rmi.server.RMISocketFactory.getDefaultSocketFactoryメソッドにより取得できます。このデフォルト・ソケット・ファクトリは、次に説明する方法で透過的なファイアウォール・トンネリング・メカニズムを備えたソケットを作成します。 このようなデフォルト動作をするクライアント側ソケットは、ファクトリのjava.rmi.server.RMISocketFactory.createSocketメソッドが提供します。このようなデフォルト動作をするサーバー側のソケットは、ファクトリのjava.rmi.server.RMISocketFactory.createServerSocketメソッドが提供します。


3.5.3クライアントの構成

クライアントはjava.rmi.server.disableHttpプロパティをブール値trueに等しく設定してRMI呼出しをHTTP要求の形式にパッケージできなくすることができます。


3.5.4サーバーの構成


注 -ホスト名は、ホストのIPアドレスとして指定されてはなりません。ファイアウォール・プロキシの中には、そのような形式のホスト名を転送しないものがあるためです。
  1. サーバー・ホストのドメインの外にあるクライアントが、あるサーバーのリモート・オブジェクトを呼び出せるためには、クライアントはまずそのサーバーを見つけ出せなければなりません。このためには、サーバーがエクスポートするリモート参照がそのサーバーの完全修飾名を含んでいなければなりません。

    サーバーのプラットフォームとネットワーク環境によっては、サーバーが実行中のJava仮想マシンがこのような情報を利用できない場合があります。利用できないときは、ホストの完全修飾された名前はサーバーがスタートする時点でjava.rmi.server.hostnameプロパティとして指定されていなければなりません。

    たとえば、次のコマンドでマシンchatsubo.javasoft.com上のRMIサーバー・クラスServerImplをスタートさせることができます。

       java -Djava.rmi.server.hostname=chatsubo.example.com ServerImpl
    
  2. サーバーが、ファイアウォールの外側にある、任意のポートへ転送可能なRMIクライアントをサポートしない場合、次の構成を使うことができます。
    1. HTTPサーバーはポート番号80を受信用に使用する。
    2. CGIスクリプトを次のエイリアスURLパスに置く
          /cgi-bin/java-rmi.cgi
      
      このスクリプトによる処理内容を次に示します。
      • ローカルなJava言語用インタプリタを呼び出して、トランスポート層の中にあるクラスを実行する。これにより要求を適切なRMIサーバー・ポートへ転送する。
      • Java仮想マシンのプロパティを、CGI 1.0で定義される環境変数と同じ名前と値で定義する。
スクリプトの例はSolarisとWin32オペレーティング・システムのRMIディストリビューションに含まれています。スクリプトはサーバー・マシン上のJava言語用インタプリタへの完全なパスを指定するだけです。


3.5.5パフォーマンス上の問題と制限

HTTP要求を介して送信された呼出しは、プロキシによる転送の時間のずれを除いたとしても、直接ソケットを介した場合よりもはるかに遅くなります。

ファイアウォールを通す場合、HTTP要求は一方向でしか開始できないため、クライアントは自分のリモート・オブジェクトをファイアウォールの外側へエクスポートすることはできません。これは、ファイアウォールの外側にあるホストが、内側にあるクライアントのメソッド呼出しを開始できないためです。



目次||
Copyright 1997, 2010, Oracle and/or its affiliates. All rights reserved.