LocalConnection の使い方

外部の SWF を読み込んで操作したいとき、 LocalConnection を使います。API がちょっと分かりにくかったので、軽くまとめておきます。

呼び出し側

まず、呼び出す側の定義から。サンプルコードで示します。

// Sender.as
package
{
  import flash.net.LocalConnection;

  public class Sender {
    // Sender
    public function Sender() {
      var conn:LocalConnection = new LocalConnection();
      conn.send("connectionName", "methodName", arguments);
    }
  }
}

send メソッドは connectionName で指定されたコネクションに定義されている(はずの)、 methodName メソッドを呼び出します。arguments に任意の数の値を渡して、メソッドの引数にする事も可能です。

受け取り側

受け取り側にも、コネクションを設定します。送信する側とコネクションの名前を同一にしておきましょう。こちらもサンプルを示しておきます。

// Receiver.as
package
{
  import flash.net.LocalConnection;

  public class Receiver {
    // Receiver
    public function Receiver() {
      var conn:LocalConnection = new LocalConnection();
      conn.client = this;
      conn.connect("connectionName");
    }

    function methodName():void {
      trace("call me?");
    }
  }
}

ここでポイントになるのは

conn.client = this;

この一行。コールバックメソッドの呼び出し先(多くの場合 this)を指定しないと、メソッドが見つからないエラーとなってしまいます。もし外部のクラスを読み込んで操作する場合などは、そのオブジェクトを対象として指定して下さい。


ちなみに、 ActionScript2 以前では、以下のように記述するようです。

var conn:LocalConnection = new LocalConnection();
conn.connect("connectionName");

conn.methodName = function() {
  trace("call me?");
}

ちょっと JavaScript っぽい感じ。ActionScript3 でこう書くと、実行時にそんなプロパティねーよと怒られてしまいます。

注意点

このコマンドにパラメータとして渡すことができるデータの量は 40 KB に制限されます。

地味に、こんな制限があったりします。40 KB を超えるかも知れない大きなデータは引数にできない可能性あり、という事ですね。なぜか型変換に失敗するようなケースでは、ここに注目してみて下さい。

また、同じ名前のコネクションを複数開く事はできません。コンパイルした swf をブラウザで表示したまま再度コンパイルを行うと、すでに利用されている接続です、とエラーが出てしまいます。このような場合、いったんブラウザ側の swf を閉じてからコンパイルをやり直します。