目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
RMI のワイヤ形式は Stream で表現されます。ここで採用している用語は、クライアントからの観点を反映させたものです。Out は出力メッセージの参照を表し、In は入力メッセージの参照を表します。トランスポートヘッダの内容は、オブジェクト直列化を使用した形式ではありません。RMI の入力と出力ストリームは対になっています。各 Out ストリームは、対応する In ストリームを持ちます。Out ストリームは、文法的にはソケットの出力ストリームにマッピングします (クライアントから見た場合)。In ストリームは、文法的には、対応するソケットの入力ストリームと対になります。出力ストリームと入力ストリームは対になっているので、入力ストリームで必要になるヘッダ情報は、プロトコルを認識できたかどうかの確認だけです。それ以外のヘッダ情報 (マジックナンバーやバージョン番号) は、ストリーム対のコンテキストに含めることが可能です。
RMI における出力ストリームは、トランスポート Header 情報とそれに続くMessages の並びから構成されます。 出力ストリームは HTTP プロトコルに呼び出しを埋め込んだものともいえます。Out: Header Messages HttpMessage
Header: 0x4a 0x52 0x4d 0x49 Version Protocol
Protocol: StreamProtocol SingleOpProtocol MultiplexProtocol
Messages: Message Messages Message
Message は特定のプロトコル内で、 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 は、トランスポートレベルのメッセージであり、リモート Virtual Machine が繋がっているかをテストします。DGCAck は、サーバの分散ガベージコレクタへ向けられたメッセージであり、サーバからの戻り値に含まれるリモートオブジェクトがクライアントによって受け取られたことを示す肯定応答信号です。
現在、入力メッセージには、ReturnData、HttpReturn、および PingAck の 3 種類があります。ReturnData は「通常の」RMI 呼び出しの結果です。HttpReturn は HTTP プロトコルに埋め込まれた呼び出しに対する戻り値です。PingAck は Ping メッセージに対する肯定応答です。In: ProtocolAck Returns ProtocolNotSupported HttpReturn
Returns: Return Returns Return