他の Flash Player インスタンスへの接続

LocalConnection クラスを使用すると、HTML コンテナや内蔵プレーヤーあるいはスタンドアローンプレーヤーの SWF など、異なる Flash Player インスタンス間で通信することができます。これにより、たとえば Web ブラウザ上の SWF ファイルやデスクトップアプリケーションに組み込まれた SWF など複数の Flash Player インスタンス間でデータの共有を実現し、非常に用途の広いアプリケーションを作成できます。

サブトピック

LocalConnection クラス
2 つの Flash Player インスタンス間のメッセージの送信
異なるドメインの SWF ドキュメントへの接続

LocalConnection クラス

LocalConnection クラスを使用すると、fscommand() メソッドや JavaScript を使用することなく他の SWF ファイルに命令を送信できる SWF ファイルを開発することができます。LocalConnection オブジェクトでの通信相手は、同じクライアントコンピュータ上で動作する SWF ファイルに限られますが、通信相手が同じアプリケーションで動作している必要はありません。たとえば、ブラウザ上で動作している SWF ファイルとプロジェクタの SWF ファイルで情報を共有しつつ、プロジェクタがローカルの情報を管理し、ブラウザ上の SWF がリモート接続を実行するといった分担もできます。プロジェクタは、スタンドアローンアプリケーションとして実行可能な形式で保存される SWF ファイルです。つまり、実行可能ファイルの内部に埋め込まれているため、プロジェクに Flash Player がインストールされている必要はありません。

LocalConnection オブジェクトは、異なるバージョンの ActionScript を使用した SWF 間の通信に使用できます。

Flash Player は、このバージョンが異なる LocalConnection オブジェクト間の通信を自動的に処理します。

LocalConnection オブジェクトの最も簡単な使用方法は、同じドメイン内の LocalConnection オブジェクト間だけで通信することです。この場合、セキュリティの問題はありません。しかし、異なるドメイン間で通信を行う必要がある場合は、セキュリティ対策を実施する必要があります。いくつかの方法があります。詳細については、『ActionScript 3.0 コンポーネントリファレンスガイド』で、send() メソッドの connectionName パラメータ、allowDomain() メソッド、および domain エントリ (LocalConnection クラスリスト内) の説明を参照してください。

ヒント

 

LocalConnection オブジェクトを使用して 1 つの SWF ファイル内でデータを送受信することは可能ですが、お勧めしません。代わりに、共有オブジェクトを使用してください。

LocalConnection オブジェクトにコールバックメソッドを追加するには、次の 3 つの方法があります。

第 1 の方法では、LocalConnection クラスを拡張することでコールバックメソッドを追加します。LocalConnection インスタンスに動的にメソッドを追加するのではなく、カスタムクラス内にメソッドを定義します。この方法を使用する例を次のコードに示します。

package
{
    import flash.net.LocalConnection;
    public class CustomLocalConnection extends LocalConnection
    {
        public function CustomLocalConnection(connectionName:String)
        {
            try
            {
                connect(connectionName);
            }
            catch (error:ArgumentError)
            {
                // サーバーは既に作成され、接続済み
            }
        }
        public function onMethod(timeString:String):void
        {
            trace("onMethod called at: " + timeString);
        }
    }
}

DynamicLocalConnection クラスの新しいインスタンスを作成する場合、次のコードを使用できます。

var serverLC:CustomLocalConnection;
serverLC = new CustomLocalConnection("serverName");

コールバックメソッドを追加する 2 つ目の方法は、LocalConnection.client プロパティを使用する方法です。次のように、カスタムクラスを作成し、そのクラスの新しいインスタンスを client プロパティに設定します。

var lc:LocalConnection = new LocalConnection();
lc.client = new CustomClient();

LocalConnection.client プロパティは、呼び出されるオブジェクトのコールバックメソッドを指定します。このコードでは、client プロパティに CustomClient というカスタムクラスの新しいインスタンスを設定しています。client プロパティのデフォルト値は、現在の LocalConnection インスタンスです。たとえば、あるウィンドウ内のボタンが別のウィンドウの表示を切り替えるアプリケーションのように、同じメソッドのセットが設定されていながら動作の異なる 2 つのデータハンドラがある場合、client プロパティを使用することができます。

CustomClient クラスを作成するには、次のようなコードを使用します。

package
{
    public class CustomClient extends Object
    {
        public function onMethod(timeString:String):void
        {
            trace("onMethod called at: " + timeString);
        }
    }
}

コールバックメソッドを追加する 3 つ目の方法は、ダイナミッククラスを作成してメソッドを動的に関連付ける方法です。この方法は次のコードが示すように、ActionScript の以前のバージョンで LocalConnection クラスを使用する方法と非常によく似ています。

import flash.net.LocalConnection;
dynamic class DynamicLocalConnection extends LocalConnection {}

コールバックメソッドは、次のコードを使用して、このクラスに動的に追加できます。

var connection:DynamicLocalConnection = new DynamicLocalConnection();
connection.onMethod = this.onMethod;
// ここにコードを追加する
public function onMethod(timeString:String):void
{
    trace("onMethod called at: " + timeString);
}

以前のコールバックメソッドの追加方法はコードの移植があまり簡単ではないため、お勧めしません。また、この方法でローカル接続を作成すると、ダイナミックプロパティへのアクセスは sealed プロパティにアクセスするより大幅に時間を要するため、パフォーマンスの問題が起きるおそれがあります。

2 つの Flash Player インスタンス間のメッセージの送信

LocalConnection クラスを使用すると、Flash Player の異なるインスタンス間での通信ができます。たとえば、1 つの Web ページ上に複数の Flash Player インスタンスがある場合や、ポップアップウィンドウ内の Flash Player インスタンスから提供されるデータを別の Flash Player インスタンスで取得する場合などが考えられます。

次のコードでは、サーバーとして機能するローカル接続オブジェクトを定義し、他の Flash Player インスタンスからの接続を受け付けます。

package
{
    import flash.net.LocalConnection;
    import flash.display.Sprite;
    public class ServerLC extends Sprite
    {
        public function ServerLC()
        {
            var lc:LocalConnection = new LocalConnection();
            lc.client = new CustomClient1();
            try
            {
                lc.connect("conn1");
            }
            catch (error:Error)
            {
                trace("error:: already connected");
            }
        }
    }
}

このコードは、最初に lc という名前の LocalConnection オブジェクトを作成し、次にカスタムクラス CustomClient1 に対して client プロパティを設定します。このローカル接続インスタンスに対して、他の Flash Player インスタンスからメソッドが呼び出されると、Flash Player は CustomClient1 クラスの該当するメソッドを探します。

何らかの Flash Player インスタンスがこの SWF ファイルに接続し、当該ローカル接続に対して何らかのメソッドを呼び出そうとすると、そのたびに、client プロパティに設定したクラス (CustomClient1 クラス) に対してリクエストが送信されます。

package
{
    import flash.events.*;
    import flash.system.fscommand;
    import flash.utils.Timer;
    public class CustomClient1 extends Object
    {
        public function doMessage(value:String = ""):void
        {
            trace(value);
        }
        public function doQuit():void
        {
            trace("quitting in 5 seconds");
            this.close();
            var quitTimer:Timer = new Timer(5000, 1);
            quitTimer.addEventListener(TimerEvent.TIMER, closeHandler);
        }
        public function closeHandler(event:TimerEvent):void
        {
            fscommand("quit");
        }
    }
}

LocalConnection サーバーを作成するには、LocalConnection.connect() メソッドを呼び出して一意の名前を指定します。指定した名前の接続が既に存在する場合は ArgumentError エラーが発生します。このエラーは、オブジェクトが接続済みであるために接続の試行が失敗したことを示します。

次のコードでは、conn1 という名前で新しいソケット接続を作成します。

try
{
    connection.connect("conn1");
}
catch (error:ArgumentError)
{
    trace("Error! Server already exists\n");
}

メモ

 

ActionScript の以前のバージョンでは、指定した接続名が既に使用されている場合に LocalConnection.connect() メソッドが Boolean 値を返しました。ActionScript 3.0 では、指定した接続名が既に使用されている場合はエラーが発生します。

第 2 SWF ファイルから第 1 SWF ファイルに接続するには、送信側の LocalConnection オブジェクトに新しい LocalConnection オブジェクトを作成し、接続名と実行するメソッド名を使用して LocalConnection.send() メソッドを呼び出す必要があります。たとえば、前の例で作成した LocalConnection オブジェクトに接続するには次のコードを使用します。

sendingConnection.send("conn1", "doQuit");

このコードは、接続名 conn1 を使用して既存の LocalConnection オブジェクトに接続し、リモート SWF ファイルの doQuit() メソッドを呼び出します。リモート SWF ファイルにパラメータを送信する場合は、次のように、send() メソッドに対するメソッド名の指定の後に追加パラメータを指定します。

sendingConnection.send("conn1", "doMessage", "Hello world");

異なるドメインの SWF ドキュメントへの接続

特定のドメインからの通信だけを許可するには、LocalConnection クラスの allowDomain() メソッドまたは allowInsecureDomain() メソッドを呼び出し、この LocalConnection オブジェクトへのアクセスを許可された 1 つまたは複数のドメインのリストを渡します。

ActionScript の以前のバージョンでは、開発者が LocalConnection.allowDomain() および LocalConnection.allowInsecureDomain() をコールバックメソッドとして実装する必要があり、また、いずれも戻り値として Boolean 値を返すようにする必要がありました。ActionScript 3.0 では、LocalConnection.allowDomain() および LocalConnection.allowInsecureDomain() はいずれも内蔵メソッドとなりました。開発者はアクセスを許可するドメイン名のリストを指定して、これらのメソッドを Security.allowDomain()Security.allowInsecureDomain() と同様に呼び出すだけで済みます。

LocalConnection.allowDomain() および LocalConnection.allowInsecureDomain() メソッドに対して指定できる特別な値として、* および localhost の 2 つがあります。アスタリスク値 (*) は、すべてのドメインにアクセスを許可することを示します。localhost というストリングは、ローカル環境にインストールされている SWF ファイルから当該 SWF ファイルへの呼び出しを許可することを示します。

Flash Player 8 から、ローカル SWF ファイルに関するセキュリティ制限が導入されました。これにより、インターネットへのアクセスを許可された SWF ファイルは、ローカルファイルシステムにはアクセスできません。localhost を指定した場合、すべてのローカル SWF ファイルは当該 SWF ファイルにアクセスできます。セキュリティ Sandbox 内から、呼び出し元コードがアクセスを認められていない SWF ファイルに対して LocalConnection.send() メソッドで接続しようとすると、securityError イベント (SecurityErrorEvent.SECURITY_ERROR) が送出されます。このエラーを回避するには、受信側の LocalConnection.allowDomain() メソッドで、呼び出し元のドメインを指定してください。

同じドメイン内の SWF ファイル間でのみ通信を行う場合は、connectionName パラメータに対して、先頭がアンダースコア (_) 以外で始まり、しかもドメイン名を含まない名前を指定します (例 : myDomain:connectionName)。また、それと同じストリングを LocalConnection.connect(connectionName) コマンドでも使用します。

異なるドメインにある SWF ファイル間での通信を実装する場合は、connectionName パラメータに対して、先頭がアンダースコアで始まる名前を指定します。このアンダースコアを付けると、受信側 LocalConnection オブジェクトを含む SWF ファイルのドメイン間におけるポータビリティが高まります。考えられる 2 つの状況を次に示します。


 

このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート

現在のページ: http://livedocs.adobe.com/flash/9.0_jp/main/00000317.html