LocalConnection について
■ LocalConnection について
1つの環境内で、複数の Flash が実行されているとします。
このとき、Flash は、相互にメッセージ通信を行う事ができます。
これはネットを経由する通信ではなく、クライアント内だけのやり取りです。
クロスドメイン通信について
ブラウザから、ドメインの異なる2つの Flash を開いて、通信する事もできます。
これにより、クロスドメイン通信が実現できます。
クロスプラットフォーム通信について
「ActionScript1.0~2.0」「ActionScript3.0」「Adobe AIR」は、相互に通信できます。
「ブラウザ用 Flash Player」「スタンドアローンプレイヤー」「プロジェクタ」などの異なる環境でも、相互に通信できます。
ただし、Google Chrome の内蔵 Flash Player とは通信できません。
■ LocalConnection オブジェクトを作成する
new 演算子を使って、LocalConnection クラスをインスタンス化します。
new LocalConnection ( ) :LocalConnection
引数 | Void | なし |
戻り値 | LocalConnection | 新しい LocalConnection オブジェクト |
LocalConnection オブジェクトを作成する
// LocalConnection オブジェクトを作成する
var local_connection = new LocalConnection();
// 出力テスト
trace(local_connection);
メッセージを受信する
■送信者のドメイン情報を確認して、受信を許可する
allowDomain イベントを使用します。
このイベントは、データを受信する直前に、毎回発行されます。
自身の Flash は、不特定多数の相手から、データが送られてきます。
■コールバック関数の仕様について
第01引数から、送信者のドメイン情報が得られます。
受信を許可する場合、戻り値から true を返します。
ローカル環境から送られてきた場合、"localhost" です。
Adobe AIR から送られてきた場合、"app#" + (アプリケーション ID) です。
Flash 6 形式の場合、ドメイン情報ではなく、スーパードメイン情報です。
■自身がセキュア(https:) で、相手がアンセキュア(http:) な接続を許す場合
allowInsecureDomain() メソッドを使用します。
コールバック関数の仕様は、allowDomain と同じです。
通常は使用しません。高いセキュリティリスクがあります。
中間者攻撃の恐れがあります。
■使用例
相手のドメインが、自身と同じ場合のみ、受信を許可する
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信者のドメイン情報を確認して、受信を許可するイベント
// ------------------------------------------------------------
local_connection.allowDomain = function ( sendingDomain ){
// ------------------------------------------------------------
// 「自身ドメイン」を取得する
// ------------------------------------------------------------
var my_domain = local_connection.domain();
// ------------------------------------------------------------
// 「自身ドメイン」と「相手ドメイン」が同じなら、受信を許可する
// ------------------------------------------------------------
if(my_domain === sendingDomain){
return true;
}
// ------------------------------------------------------------
// 未知のドメインからの接続なので、受信を拒絶する
// ------------------------------------------------------------
return false;
};
信頼できる相手のドメインである場合のみ、受信を許可する
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信者のドメイン情報を確認して、受信を許可するイベント
// ------------------------------------------------------------
local_connection.allowDomain = function ( sendingDomain ){
// ------------------------------------------------------------
// 信頼するドメイン
// ------------------------------------------------------------
var domain_allow = "sub.example.com";
// ------------------------------------------------------------
// 信頼する相手ドメインなら、受信を許可する
// ------------------------------------------------------------
if(sendingDomain === domain_allow){
return true;
}
// ------------------------------------------------------------
// 未知のドメインからの接続なので、受信を拒絶する
// ------------------------------------------------------------
return false;
};
■受信用のコールバック関数を登録する
LocalConnection オブジェクトに、好きな名前のプロパティを追加します。
このプロパティに、受信用のコールバック関数を登録します。
■受信用コールバック関数の仕様について
引数から、送信者から送られてきた情報が得られます。
引数は、可変引数です。
■使用例
受信用コールバック関数を登録する
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// メッセージを受信した時に実行されるコールバック関数
// ------------------------------------------------------------
local_connection.onMessage = function (data){
// 送信者から送られてきた情報
trace(data);
};
■メッセージの受付を開始する
connect() メソッドを使用します。
LocalConnection.connect ( "コネクション名" ) :Boolean
第01引数 | String | コネクション名を指定する |
戻り値 | Boolean | 受付開始に成功した場合 true、失敗した場合 false |
■第01引数 (コネクション名)
好きなコネクション名を指定します。
『 : 』記号を含める事はできません。
コネクション名は、ユニーク(唯一)である必要があります。
別の Flash によって既に使われている場合、失敗します。
■第01引数 (グローバルなコネクション名)
名前の先頭にアンダーバー『 _ 』を付加します。
以下のように記述します。
『 _ 』+『 コネクション名 』
この場合、ドメインに関係なく、全体で1つしか存在できません。
■戻り値 (受付開始に成功したか?)
このメソッドは、失敗する事があります。
第01引数の仕様に注意して下さい。
■使用例
メッセージの受付を開始する
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// メッセージの受付を開始する
// ------------------------------------------------------------
var result = local_connection.connect( "MyConnection" );
// 出力テスト
trace(result);
■メッセージの受付を終了する
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 アプリに送信したい場合に必要となります。
■戻り値 (送信開始に成功したか?)
引数の構文に不備がある場合、メソッドは失敗します。
一度に送信できるのは、約 4 KByte までです。
実際の送信結果を知るには、onStatus イベントを使用します。
■使用例
同じドメインの相手にメッセージを送信する
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
var result = local_connection.send( "MyConnection" , "onMessage" , request_obj );
// 出力テスト
trace(result);
別ドメインの相手にメッセージを送信する
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 信頼するスーパードメイン
// ------------------------------------------------------------
var super_domain_allow = "example.com";
// ------------------------------------------------------------
// 相手のコネクション名
// ------------------------------------------------------------
var connection_name_recv = "MyConnection";
// ------------------------------------------------------------
// 送信コネクション名(「相手のスーパードメイン」+「相手のコネクション名」)
// ------------------------------------------------------------
var connection_name_send = (super_domain_allow) + ":" + (connection_name_recv);
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
var result = local_connection.send( connection_name_send , "onMessage" , request_obj );
// 出力テスト
trace(result);
■メッセージの送信結果を取得する
onStatus イベントを使用します。
■コールバック関数の仕様について
第01引数から、情報オブジェクトが得られます。
level プロパティから、以下の文字列が得られます。
文字列 | 解説 |
"status" | 送信に成功した |
"error" | 送信に失敗した |
■使用例
送信結果を取得する
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信結果を取得するイベント
// ------------------------------------------------------------
local_connection.onStatus = function ( info ){
// ------------------------------------------------------------
// 送信結果を取得する
// ------------------------------------------------------------
var result = info.level;
switch(result){
case "status":
trace("送信に成功した");
break;
case "error":
trace("送信に失敗した");
break;
}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
local_connection.send( "MyConnection" , "onMessage" , "送信テスト" );
メッセージの送受信例
■同じドメイン内で送受信する
■送信側の処理について
自身と同じドメイン内にある Flash にメッセージを送信する
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
_root.createTextField( "text_field" , 1 , 10 , 10 , Stage.width-20 , Stage.height-20 );
// テキストフィールドの参照を取得
var text_field = _root.text_field;
// 枠線を表示
text_field.border = true;
// ------------------------------------------------------------
// テキストフィールドに出力する関数
// ------------------------------------------------------------
function TextFieldWrite(text_field , str){
text_field.text += (str) + "\n";
}
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信結果を取得するイベント
// ------------------------------------------------------------
local_connection.onStatus = function ( info ){
TextFieldWrite(text_field , "送信結果:" + (info.level));
};
// ------------------------------------------------------------
// マウスボタンを押すと実行されるイベント
// ------------------------------------------------------------
_root.onMouseDown = function (){
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
var result = local_connection.send( "MyConnection" , "onMessage" , request_obj );
TextFieldWrite(text_field , "送信開始:" + (result));
};
■受信側の処理について
メッセージを受信する(この例では、自身と同じドメインのみ信頼し、それ以外を拒絶している)
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
_root.createTextField( "text_field" , 1 , 10 , 10 , Stage.width-20 , Stage.height-20 );
// テキストフィールドの参照を取得
var text_field = _root.text_field;
// 枠線を表示
text_field.border = true;
// ------------------------------------------------------------
// テキストフィールドに出力する関数
// ------------------------------------------------------------
function TextFieldWrite(text_field , str){
text_field.text += (str) + "\n";
}
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信者のドメイン情報を確認して、受信を許可するイベント
// ------------------------------------------------------------
local_connection.allowDomain = function ( sendingDomain ){
TextFieldWrite(text_field , "受信相手:" + (sendingDomain));
// ------------------------------------------------------------
// 「自身ドメイン」を取得する
// ------------------------------------------------------------
var my_domain = local_connection.domain();
// ------------------------------------------------------------
// 「自身ドメイン」と「相手ドメイン」が同じなら、受信を許可する
// ------------------------------------------------------------
if(my_domain === sendingDomain){
TextFieldWrite(text_field , "受信許可:" + (true));
return true;
}
// ------------------------------------------------------------
// 未知のドメインからの接続なので、受信を拒絶する
// ------------------------------------------------------------
TextFieldWrite(text_field , "受信許可:" + (false));
return false;
};
// ------------------------------------------------------------
// メッセージを受信した時に実行されるコールバック関数
// ------------------------------------------------------------
local_connection.onMessage = function (data){
TextFieldWrite(text_field , "受信データ:" + (data.message));
};
// ------------------------------------------------------------
// メッセージの受付を開始する
// ------------------------------------------------------------
var result = local_connection.connect( "MyConnection" );
TextFieldWrite(text_field , "受付開始:" + (result));
■異なるドメイン同士で送受信する
送信側のコンテンツを "http://sub.send.com/flash.swf" とします。
受信側のコンテンツを "http://sub.recv.com/flash.swf" とします。
■ http://sub.send.com 側の処理について
recv.com 内にある Flash にメッセージを送信する
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
_root.createTextField( "text_field" , 1 , 10 , 10 , Stage.width-20 , Stage.height-20 );
// テキストフィールドの参照を取得
var text_field = _root.text_field;
// 枠線を表示
text_field.border = true;
// ------------------------------------------------------------
// テキストフィールドに出力する関数
// ------------------------------------------------------------
function TextFieldWrite(text_field , str){
text_field.text += (str) + "\n";
}
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信結果を取得するイベント
// ------------------------------------------------------------
local_connection.onStatus = function ( info ){
TextFieldWrite(text_field , "送信結果:" + (info.level));
};
// ------------------------------------------------------------
// 信頼するスーパードメイン
// ------------------------------------------------------------
var super_domain_allow = "recv.com";
// ------------------------------------------------------------
// 相手のコネクション名
// ------------------------------------------------------------
var connection_name_recv = "MyConnection";
// ------------------------------------------------------------
// 送信コネクション名(「相手のスーパードメイン」+「相手のコネクション名」)
// ------------------------------------------------------------
var connection_name_send = (super_domain_allow) + ":" + (connection_name_recv);
// ------------------------------------------------------------
// マウスボタンを押すと実行されるイベント
// ------------------------------------------------------------
_root.onMouseDown = function (){
// ------------------------------------------------------------
// 送信用オブジェクト
// ------------------------------------------------------------
var request_obj = {
message:"送信テスト",
param:{}
};
// ------------------------------------------------------------
// メッセージの送信を開始する
// ------------------------------------------------------------
var result = local_connection.send( connection_name_send , "onMessage" , request_obj );
TextFieldWrite(text_field , "送信開始:" + (result));
};
■ http://sub.recv.com 側の処理について
メッセージを受信する(この例では、sub.send.com のみ信頼し、それ以外を拒絶している)
// ------------------------------------------------------------
// テキストフィールドを作成
// ------------------------------------------------------------
_root.createTextField( "text_field" , 1 , 10 , 10 , Stage.width-20 , Stage.height-20 );
// テキストフィールドの参照を取得
var text_field = _root.text_field;
// 枠線を表示
text_field.border = true;
// ------------------------------------------------------------
// テキストフィールドに出力する関数
// ------------------------------------------------------------
function TextFieldWrite(text_field , str){
text_field.text += (str) + "\n";
}
// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();
// ------------------------------------------------------------
// 送信者のドメイン情報を確認して、受信を許可するイベント
// ------------------------------------------------------------
local_connection.allowDomain = function ( sendingDomain ){
TextFieldWrite(text_field , "受信相手:" + (sendingDomain));
// ------------------------------------------------------------
// 信頼するドメイン
// ------------------------------------------------------------
var domain_allow = "sub.send.com";
// ------------------------------------------------------------
// 信頼する相手なら、受信を許可する
// ------------------------------------------------------------
if(sendingDomain === domain_allow){
TextFieldWrite(text_field , "受信許可:" + (true));
return true;
}
// ------------------------------------------------------------
// 未知のドメインからの接続なので、受信を拒絶する
// ------------------------------------------------------------
TextFieldWrite(text_field , "受信許可:" + (false));
return false;
};
// ------------------------------------------------------------
// メッセージを受信した時に実行されるコールバック関数
// ------------------------------------------------------------
local_connection.onMessage = function (data){
TextFieldWrite(text_field , "受信データ:" + (data.message));
};
// ------------------------------------------------------------
// メッセージの受付を開始する
// ------------------------------------------------------------
var result = local_connection.connect( "MyConnection" );
TextFieldWrite(text_field , "受付開始:" + (result));
スーパードメインについて
■スーパードメインについて
以下の様な、URL があるとします。
『 http://sub.example.com:8080 』
スーパードメインとは、以下の部分です。
『 http:// 』『 sub. 』『 example.com 』『 :8080 』
「プロトコル」「サブドメイン」「ポート番号」は含まれません。
■ドメインについて
以下の様な、URL があるとします。
『 http://sub.example.com:8080 』
ドメインとは、以下の部分です。
『 http:// 』『 sub.example.com 』『 :8080 』
「プロトコル」「ポート番号」は含まれません。