Flashゲーム講座 & アクションスクリプトサンプル集

 

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 オブジェクトに、好きな名前のプロパティを追加します。
 
このプロパティに、受信用のコールバック関数を登録します。
 
ここでは、"onMessage" とします。
 
送信者は、このプロパティ名を、事前に知っている必要があります。
 
■受信用コールバック関数の仕様について
 
引数から、送信者から送られてきた情報が得られます。
 
引数は、可変引数です。
 
■使用例
 
受信用コールバック関数を登録する

// ------------------------------------------------------------
// LocalConnection オブジェクトを作成する
// ------------------------------------------------------------
var local_connection = new LocalConnection();

// ------------------------------------------------------------
// メッセージを受信した時に実行されるコールバック関数
// ------------------------------------------------------------
local_connection.onMessage = function (data){

	// 送信者から送られてきた情報
	trace(data);

};
 

■メッセージの受付を開始する

 
connect() メソッドを使用します。
 
LocalConnection.connect ( "コネクション名" ) :Boolean
第01引数 Stringコネクション名を指定する
戻り値 Boolean受付開始に成功した場合 true、失敗した場合 false
 
■第01引数 (コネクション名)
 
好きなコネクション名を指定します。
 
『 : 』記号を含める事はできません。
 
ここでは、"MyConnection" とします。
 
送信者は、このコネクション名を、事前に知っている必要があります。
 
コネクション名は、ユニーク(唯一)である必要があります。
 
別の Flash によって既に使われている場合、失敗します。
 
この制約は、同じスーパードメイン内の Flash 同士でのみ発生します。
 
別のスーパードメインの 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 』
 
「プロトコル」「ポート番号」は含まれません。