目次 | 前へ | 次へ 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.