CURL.REMOTE パッケージは、異なる Curl プロセス間のコミュニケーションに使われる API を含んでいます。コミュニケーションは、メッセージのパスまたは、リモート プロシージャ コール(RPC)で行われます。サブアプレットは、このために使うことが出来る設定済みの接続を持っています。アプレットは、
SocketRemoteConnection と
SocketRemoteAcceptor を使用して、独自のプロセス間通信を作ることも出来ます。
各終端は、様々なリモート インターフェースを使用して、多くのオブジェクトを開示し、他の終端は、両端が使用されるインターフェースと
RemoteYxorp 及び
RemoteProxyによって使用される
whom に同意している限り、これらのオブジェクトにアクセスすることが出来ます。
これが簡単にしたサンプルです。より複雑なサンプルは以下のファイルにあります。:
d:\automated-build-temp\build\win32-atom\docs\default\examples\dguide\remote.zip 書庫からサンプル ファイルを解凍してください。サンプル ファイルを含むディレクトリに特権を与えるか、ファイルを Web サーバーにコピーする必要があります。サンプルの使用に関する情報は、
拡張したサンプル を参照してください。
共通のヘルパー ファイル、"remote.scurl" で、簡単なリモート クラス Calculator を定義しており、それは、二つの整数を加算し、複雑な計算の代わりを表す10秒間のポーズが設定されています。
{import * from CURL.REMOTE}
{define-remote-class public Calculator
{define-remote-proxy-class public CalculatorProxy}
{define-remote-yxorp-class public CalculatorYxorp}
{remote-method public {add x:int, y:int}:int
{sleep 10s}
{return x + y}
}
}
子アプレット、"child.curl" では、Calculator を作成し、それを登録して、適切な CalculatorYxorp を作成することにより、親アプレットからのリモート呼び出しを処理出来るようにします。
{include "remote.scurl"}
{def calculator = {Calculator}}
{def connection = {get-the-applet}.inline-remote-connection}
{def yxorp = {CalculatorYxorp connection, 0, calculator}}
親アプレット、"parent.curl" は、子アプレットと適切な CalculatorProxy を作成し、それを使って同じ呼出を非同期に実行します。
{import AppletData from CURL.ENGINE.BROWSER}
{include "remote.scurl"}
{def child = {AppletData null, {url "child.curl"}}}
{def connection = child.inline-remote-connection}
{def proxy = {CalculatorProxy connection, 0}}
{bold Initiating remote asynchronous call...}
{remote-invoke-async
{proxy.add 1, 2}
receiving result:int do
{popup-message "Remote result = " & result}
catch ex:Exception do
{popup-message "Remote problem: " & ex.message}
}
{bold Initiating remote asynchronous call... done.}
同期呼び出しの間、親アプレットはロードを停止し、フリーズしたように見え、再描画されませんが、非同期呼び出しの間、親アプレットはロードを継続し、再描画されることに注意してください。
各
RemoteEvent はまた、query または、reply の受信者を示す整数の
whom 値、
RemoteEvent の目的を示す整数の
code 値、バイナリ ペイロードである
data を含みます。構造化されたデータは、
RemoteEvent の
data ペイロードにシリアル化または、"マーシャル"されます。
kind、
whom、
code は、リモート システムがパースし、解釈することが出来る
RemoteEvent ヘッダーを構成します。
data は、
RemoteEvent ヘッダー フィールドに応じて送られた解釈されないペイロードです。ペイロード データは、リモート接続の終端で知られた形式のフォーマットでエンコードされなければなりません。
より進んだユーザーは以下の情報にも興味があるかもしれません。:
RemoteConnection.send-event メソッドは、
RemoteEvent を送るのに使用することが出来ます。このメソッドは、抽象であり、サブクラスで定義されなければなりません。すぐにイベントを送ることが出来ますが、特に非同期オープンが進行中の場合または、元のバッファが一時的に満杯の場合には、このメソッドは、後で送るようにイベントまたはイベントの一部をキューに入れます。例えば、
接続は、”非同期”モードで作成出来る場合があり、接続がまだ完了していない(またはキャンセルされた)時、
RemoteConnection.opening? は
true になります。この状態の場合、query の送信をしようとすると、実際には、オープンが完了した時には送信する為に、また、オープンがキャンセル失敗した時には、失敗応答を作成する為に、query はキューに入れられます。この状態で、接続を閉じようとすると、単に接続は閉じているとマークされ、接続が完了し、キューに入っている query が送信され、特別な"close"イベントが送信されるようになります。この状態で接続を破棄しようとすると、接続が中断します。
Copyright © 1998-2019 SCSK Corporation.
All rights reserved.
Curl, the Curl logo, Surge, and the Surge logo are trademarks of SCSK Corporation.
that are registered in the United States. Surge
Lab, the Surge Lab logo, and the Surge Lab Visual Layout Editor (VLE)
logo are trademarks of SCSK Corporation.