LocalConnection について
■ LocalConnection について
1つの環境内で、複数の Flash が実行されているとします。
このとき、Flash は、相互にメッセージ通信を行う事ができます。
これはネットを経由する通信ではなく、クライアント内だけのやり取りです。
クロスドメイン通信について
ブラウザから、ドメインの異なる2つの Flash を開いて、通信する事もできます。
これにより、クロスドメイン通信が実現できます。
クロスプラットフォーム通信について
「ActionScript1.0~2.0」「ActionScript3.0」「Adobe AIR」は、相互に通信できます。
「ブラウザ用 Flash Player」「スタンドアローンプレイヤー」「プロジェクタ」などの異なる環境でも、相互に通信できます。
ただし、Google Chrome の内蔵 Flash Player とは通信できません。
■自身の実行環境で、ローカルコネクションが利用可能か調べる
この確認用のプロパティは、Flash Player 10.1 以降、Adobe AIR 2.0 以降で利用可能です。
実行環境ごとのサポート状況については、公式リファレンスが参考になります。
http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/net/LocalConnection.html
ローカルコネクション機能が利用可能か調べる
import flash.net.LocalConnection;
import flash.text.TextField;
// テキストフィールドを作成
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = 20;
text_field.border = true;
stage.addChild(text_field);
text_field.text = "ローカルコネクション機能が利用可能:" + LocalConnection.isSupported;
■ LocalConnection オブジェクトを作成する
new 演算子を使って、LocalConnection クラスをインスタンス化します。
new LocalConnection ( ) :LocalConnection
引数 | void | なし |
戻り値 | LocalConnection | 新しい LocalConnection オブジェクト |
LocalConnection オブジェクトを作成する
import flash.net.LocalConnection;
// LocalConnection オブジェクトを作成する
var local_connection:LocalConnection = new LocalConnection();
// 出力テスト
trace(local_connection);
メッセージを受信する
■データの受信を許可する(指定ドメインのみ)
allowDomain() メソッドを使用します。
自身の Flash は、不特定多数の相手から、データが送られてきます。
自身と同じドメインから送られた場合、設定に関係なく必ず受け入れます。
それ以外は、指定したドメインから送られた場合のみ、受け入れます。
Security.allowDomain ( "ドメイン名" , ... ) :void
可変引数 | String | ドメイン名を指定。指定ドメインから送られてきたデータのみを受け取れる。 すべてのドメインを許可する場合 "*" を指定。 複数のドメインを指定する場合、第02引数以降に順番に指定。 |
戻り値 | void | なし |
■自身がセキュア(https:) で、相手がアンセキュア(http:) な接続を許す場合
allowInsecureDomain() メソッドを使用します。
通常は使用しません。高いセキュリティリスクがあります。
中間者攻撃の恐れがあります。
Security.allowInsecureDomain ( "ドメイン名" , ... ) :void
可変引数 | String | ドメイン名を指定。指定ドメインから送られてきたデータのみを受け取れる。 すべてのドメインを許可する場合 "*" を指定。 複数のドメインを指定する場合、第02引数以降に順番に指定。 |
戻り値 | void | なし |
■使用例
信頼できる相手のドメインである場合、受信を許可する
import flash.net.LocalConnection;
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 信頼するドメイン
// ------------------------------------------------------------
var domain_allow:String = "sub.example.com";
// ------------------------------------------------------------
// データの受信を許可する(指定ドメインのみ)
// ------------------------------------------------------------
local_connection.allowDomain(domain_allow);
■受信用のコールバック関数を登録する
■リスナー用オブジェクトを作成する
リスナー用オブジェクトを作成します。
リスナー用オブジェクトに、好きな名前のプロパティを追加します。
このプロパティに、受信用のコールバック関数を登録します。
■受信用コールバック関数の仕様について
引数から、送信者から送られてきた情報が得られます。
引数は、可変引数です。
■リスナーを登録する
client プロパティを使用します。
リスナー用オブジェクトを渡します。
■使用例
受信用コールバック関数を登録する
import flash.net.LocalConnection;
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// リスナー用オブジェクトを作成
// ------------------------------------------------------------
var listener_obj:Object = {
// ------------------------------------------------------------
// メッセージを受信した時に実行されるコールバック関数
// ------------------------------------------------------------
onMessage:function (data:*):void{
// 送信者から送られてきた情報
trace(data);
}
};
// ------------------------------------------------------------
// リスナーを登録する
// ------------------------------------------------------------
local_connection.client = listener_obj;
■メッセージの受付を開始する
connect() メソッドを使用します。
LocalConnection.connect ( "コネクション名" ) :void
第01引数 | String | コネクション名を指定する |
戻り値 | void | なし |
■第01引数 (コネクション名)
好きなコネクション名を指定します。
『 : 』記号を含める事はできません。
コネクション名は、ユニーク(唯一)である必要があります。
別の Flash によって既に使われている場合、失敗します。
■第01引数 (グローバルなコネクション名)
名前の先頭にアンダーバー『 _ 』を付加します。
以下のように記述します。
『 _ 』+『 コネクション名 』
この場合、ドメインに関係なく、全体で1つしか存在できません。
■エラーについて
このメソッドは、失敗する事があります。
第01引数の仕様に注意して下さい。
■使用例
メッセージの受付を開始する
import flash.net.LocalConnection;
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// メッセージの受付を開始する
// ------------------------------------------------------------
try{
local_connection.connect( "MyConnection" );
}catch(e:Error){
}
■メッセージの受付を終了する
close() メソッドを使用します。
メッセージを受付中ではない場合、エラーが発生します。
LocalConnection.close ( ) :void
引数 | void | なし |
戻り値 | void | なし |
メッセージを送信する
■メッセージを送信する
send() メソッドを使用します。
LocalConnection.send ( "コネクション名" , "受信プロパティ名" , 送信データ ... ) :Boolean
第01引数 | String | 相手の「スーパードメイン」と「コネクション名」を指定 |
第02引数 | String | 相手の「受信プロパティ名」を指定 |
可変引数 | Object | 送信データを指定 |
戻り値 | Boolean | 送信開始に成功した場合 true、失敗した場合 false |
■第01引数 (コネクション名のみ)
コネクション名のみを指定したとします。
■第01引数 (スーパードメイン + コネクション名)
スーパードメイン情報を付加する事ができます。
以下のように記述します。
『スーパードメイン 』+『 : 』+『 コネクション名 』
この場合、送信先は、指定したスーパードメイン内に限定されます。
信頼する別サイトに送信したい場合に必要となります。
ローカル環境へ送信するには、『 localhost: 』を付加します。
■第01引数 (グローバルなコネクション名)
名前の先頭にアンダーバー『 _ 』を付加する事ができます。
以下のように記述します。
『 _ 』+『 コネクション名 』
この場合、コネクション名さえ完全一致していれば、誰にでも送信できます。
信頼の無いサイトにも、送信してしまう恐れがあります。
受信側にもアンダーバーが付加されている必要があります。
■第01引数 (Adobe AIR 用のコネクション名)
アプリケーション ID 情報を付加する事ができます。
以下のように記述します。
『 app# 』+『 アプリケーション ID 』+『 : 』+『 コネクション名 』
この場合、送信先は、指定した「AIR アプリケーション」に限定されます。
信頼する AIR アプリに送信したい場合に必要となります。
■エラーについて
引数の構文に不備がある場合、メソッドは失敗します。
一度に送信できるのは、40 KByte までです。
ActionScript2.0 以前の環境では、約 4 KByte までです。
実際の送信結果を知るには、StatusEvent.STATUS イベントを使用します。
■使用例
同じドメインの相手にメッセージを送信する
import flash.net.LocalConnection;
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj:Object = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
try{
local_connection.send( "MyConnection" , "onMessage" , request_obj );
}catch(e:Error){
}
別ドメインの相手にメッセージを送信する
import flash.net.LocalConnection;
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 信頼するスーパードメイン
// ------------------------------------------------------------
var super_domain_allow:String = "example.com";
// ------------------------------------------------------------
// 相手のコネクション名
// ------------------------------------------------------------
var connection_name_recv:String = "MyConnection";
// ------------------------------------------------------------
// 送信コネクション名(「相手のスーパードメイン」+「相手のコネクション名」)
// ------------------------------------------------------------
var connection_name_send:String = (super_domain_allow) + ":" + (connection_name_recv);
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj:Object = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
try{
local_connection.send( connection_name_send , "onMessage" , request_obj );
}catch(e:Error){
}
AIR アプリケーション相手にメッセージを送信する
import flash.net.LocalConnection;
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 信頼するアプリケーション ID
// ------------------------------------------------------------
var app_id_allow:String = "com.example";
// ------------------------------------------------------------
// 相手のコネクション名
// ------------------------------------------------------------
var connection_name_recv:String = "MyConnection";
// ------------------------------------------------------------
// 送信コネクション名(「相手のアプリケーション ID」+「相手のコネクション名」)
// ------------------------------------------------------------
var connection_name_send:String = "app#" + (app_id_allow) + ":" + (connection_name_recv);
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj:Object = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
try{
local_connection.send( connection_name_send , "onMessage" , request_obj );
}catch(e:Error){
}
■メッセージの送信結果を取得する
StatusEvent.STATUS イベントを使用します。
■StatusEvent イベントについて
コールバック関数の引数から、StatusEvent オブジェクトが得られます。
level プロパティから、以下の文字列が得られます。
文字列 | 解説 |
"status" | 送信に成功した |
"error" | 送信に失敗した |
■使用例
送信結果を取得する
import flash.net.LocalConnection;
import flash.events.StatusEvent;
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 送信結果を取得するイベント
// ------------------------------------------------------------
local_connection.addEventListener( StatusEvent.STATUS , function (e:StatusEvent):void{
// ------------------------------------------------------------
// 送信結果を取得する
// ------------------------------------------------------------
var result:String = e.level;
switch(result){
case "status":
trace("送信に成功した");
break;
case "error":
trace("送信に失敗した");
break;
}
});
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
local_connection.send( "MyConnection" , "onMessage" , "送信テスト" );
メッセージの送受信例
■同じドメイン内で送受信する
■送信側の処理について
自身と同じドメイン内にある Flash にメッセージを送信する
import flash.net.LocalConnection;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.events.StatusEvent;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
text_field.border = true;
stage.addChild(text_field);
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 送信結果を取得するイベント
// ------------------------------------------------------------
local_connection.addEventListener( StatusEvent.STATUS , function (e:StatusEvent):void{
text_field.appendText("送信結果:" + (e.level) + "\n");
});
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj:Object = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
try{
local_connection.send( "MyConnection" , "onMessage" , request_obj );
text_field.appendText("送信開始:" + (true) + "\n");
}catch(e:Error){
text_field.appendText("送信開始:" + (e.toString()) + "\n");
}
});
■受信側の処理について
メッセージを受信する(この例では、自身と同じドメインのみ信頼し、それ以外を拒絶している)
import flash.net.LocalConnection;
import flash.text.TextField;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
text_field.border = true;
stage.addChild(text_field);
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// リスナー用オブジェクトを作成
// ------------------------------------------------------------
var listener_obj:Object = {
// ------------------------------------------------------------
// メッセージを受信した時に実行されるコールバック関数
// ------------------------------------------------------------
onMessage:function (data:*):void{
text_field.appendText("受信データ:" + (data.message) + "\n");
}
};
// ------------------------------------------------------------
// リスナーを登録する
// ------------------------------------------------------------
local_connection.client = listener_obj;
// ------------------------------------------------------------
// メッセージの受付を開始する
// ------------------------------------------------------------
try{
local_connection.connect( "MyConnection" );
text_field.appendText("受付開始:" + (true) + "\n");
}catch(e:Error){
text_field.appendText("受付開始:" + (e.toString()) + "\n");
}
■異なるドメイン同士で送受信する
送信側のコンテンツを "http://sub.send.com/flash.swf" とします。
受信側のコンテンツを "http://sub.recv.com/flash.swf" とします。
■ http://sub.send.com 側の処理について
recv.com 内にある Flash にメッセージを送信する
import flash.net.LocalConnection;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.events.StatusEvent;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
text_field.border = true;
stage.addChild(text_field);
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 送信結果を取得するイベント
// ------------------------------------------------------------
local_connection.addEventListener( StatusEvent.STATUS , function (e:StatusEvent):void{
text_field.appendText("送信結果:" + (e.level) + "\n");
});
// ------------------------------------------------------------
// 信頼するスーパードメイン
// ------------------------------------------------------------
var super_domain_allow:String = "recv.com";
// ------------------------------------------------------------
// 相手のコネクション名
// ------------------------------------------------------------
var connection_name_recv:String = "MyConnection";
// ------------------------------------------------------------
// 送信コネクション名(「相手のスーパードメイン」+「相手のコネクション名」)
// ------------------------------------------------------------
var connection_name_send:String = (super_domain_allow) + ":" + (connection_name_recv);
// ------------------------------------------------------------
// マウスの左ボタンをクリックすると実行されるイベント
// ------------------------------------------------------------
stage.addEventListener( MouseEvent.MOUSE_DOWN , function (e:MouseEvent):void{
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj:Object = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
try{
local_connection.send( connection_name_send , "onMessage" , request_obj );
text_field.appendText("送信開始:" + (true) + "\n");
}catch(e:Error){
text_field.appendText("送信開始:" + (e.toString()) + "\n");
}
});
■ http://sub.recv.com 側の処理について
メッセージを受信する(この例では、sub.send.com のみ信頼し、それ以外を拒絶している)
import flash.net.LocalConnection;
import flash.text.TextField;
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
var text_field:TextField = new TextField();
text_field.x = 10;
text_field.y = 10;
text_field.width = stage.stageWidth - 20;
text_field.height = stage.stageHeight - 20;
text_field.border = true;
stage.addChild(text_field);
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection:LocalConnection = new LocalConnection();
// ------------------------------------------------------------
// 信頼するドメイン
// ------------------------------------------------------------
var domain_allow:String = "sub.send.com";
// ------------------------------------------------------------
// データの受信を許可する(指定ドメインのみ)
// ------------------------------------------------------------
local_connection.allowDomain(domain_allow);
// ------------------------------------------------------------
// リスナー用オブジェクトを作成
// ------------------------------------------------------------
var listener_obj:Object = {
// ------------------------------------------------------------
// メッセージを受信した時に実行されるコールバック関数
// ------------------------------------------------------------
onMessage:function (data:*):void{
text_field.appendText("受信データ:" + (data.message) + "\n");
}
};
// ------------------------------------------------------------
// リスナーを登録する
// ------------------------------------------------------------
local_connection.client = listener_obj;
// ------------------------------------------------------------
// メッセージの受付を開始する
// ------------------------------------------------------------
try{
local_connection.connect( "MyConnection" );
text_field.appendText("受付開始:" + (true) + "\n");
}catch(e:Error){
text_field.appendText("受付開始:" + (e.toString()) + "\n");
}
スーパードメインについて
■スーパードメインについて
以下の様な、URL があるとします。
『 http://sub.example.com:8080 』
スーパードメインとは、以下の部分です。
『 http:// 』『 sub. 』『 example.com 』『 :8080 』
「プロトコル」「サブドメイン」「ポート番号」は含まれません。
■ドメインについて
以下の様な、URL があるとします。
『 http://sub.example.com:8080 』
ドメインとは、以下の部分です。
『 http:// 』『 sub.example.com 』『 :8080 』
「プロトコル」「ポート番号」は含まれません。