目次 | 前へ | 次へ | Java Remote Method Invocation |
In
RMI の入力と出力ストリームは対になっています。各 Out ストリームは、対応する In ストリームを持ちます。Out ストリームは、文法的にはソケットの出力ストリームにマッピングします (クライアントから見た場合)。In ストリームは、文法的には、対応するソケットの入力ストリームと対になります。出力ストリームと入力ストリームは対になっているので、入力ストリームで必要になるヘッダー情報は、プロトコルを認識できたかどうかの確認だけです。それ以外のヘッダー情報 (マジックナンバーやバージョン番号) は、ストリーム対のコンテキストに含めることが可能です。
Messages は特定のプロトコル内で、Protocol が指定する方法に従ってラップされます。SingleOpProtocol の場合は、Header に続く Message が 1 つしかない場合があり、Message がラップされる追加データが存在しないことがあります。SingleOpProtocol は HTTP 要求に組み込まれた呼び出しのために使用されます。単一の要求と応答以上の相互作用はありません。
StreamProtocol と MultiplexProtocol の場合は、サーバーはバイトコード 0x4e で応答してプロトコルのサポートの通知と、サーバーが認識できるホスト名とポート番号を含んだ EndpointIdentifier は現在クライアントが使用中であることを知らせます。この情報を使ってクライアントは、セキュリティー上の理由でできない場合もありますが、自分のホスト名を知ることができます。クライアントはそのあと、もう 1 つの EndpointIdentifier で応答する必要があり、応答の中には接続を受け付けるときのデフォルトの終点が含まれます。MultiplexProtocol では、サーバーはこの情報からクライアントを特定できます。
StreamProtocol の場合は、このエンドポイントのネゴシエーションのあとに、それ以上のデータのラッピングを行うことなしに Messages が出力ストリームへ送られます。MultiplexProtocol の場合は、「セクション 10.6 RMI の多重プロトコル」で解説されているように、ソケット接続が多重接続の具象接続として使用されます。この多重化された接続上で開始された仮想接続は、次に説明される一連の Messages から構成されます。
現在、入力メッセージには、Call、Ping および DgcAck という 3 つのタイプがあります。Call は、メソッド呼び出しをエンコードします。Ping は、トランスポートレベルのメッセージであり、リモート仮想マシンの状態をテストします。DGCAck は、サーバーの分散ガベージコレクタへ向けられた肯定応答であり、サーバーからの戻り値に含まれるリモートオブジェクトがクライアントによって受け取られたことを示します。