Flashゲームプログラミング講座 for ActionScript3.0

 

LocalConnection について

 


■ LocalConnection について

 
1つの環境内で、複数の Flash が実行されているとします。
 
このとき、Flash は、相互にメッセージ通信を行う事ができます。
 
これはネットを経由する通信ではなく、クライアント内だけのやり取りです。
 
クロスドメイン通信について
 
ブラウザから、ドメインの異なる2つの Flash を開いて、通信する事もできます。
 
これにより、クロスドメイン通信が実現できます。
 
クロスプラットフォーム通信について
 
「ActionScript1.0~2.0」「ActionScript3.0」「Adobe AIR」は、相互に通信できます。
 
「ブラウザ用 Flash Player」「スタンドアローンプレイヤー」「プロジェクタ」などの異なる環境でも、相互に通信できます。
 
ただし、Google Chrome の内蔵 Flash Player とは通信できません。
 

■自身の実行環境で、ローカルコネクションが利用可能か調べる

 
LocalConnection.isSupported プロパティを使用します。
 
この確認用のプロパティは、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 は、不特定多数の相手から、データが送られてきます。
 
自身と同じドメインから送られた場合、設定に関係なく必ず受け入れます。
 
それ以外は、指定したドメインから送られた場合のみ、受け入れます。
 
ローカル環境から送られてきた場合、"localhost" です。
 
Adobe AIR から送られてきた場合、"app#" + (アプリケーション ID) です。
 
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);
 

■受信用のコールバック関数を登録する

 
■リスナー用オブジェクトを作成する
 
リスナー用オブジェクトを作成します。
 
リスナー用オブジェクトに、好きな名前のプロパティを追加します。
 
このプロパティに、受信用のコールバック関数を登録します。
 
ここでは、"onMessage" とします。
 
送信者は、このプロパティ名を、事前に知っている必要があります。
 
■受信用コールバック関数の仕様について
 
引数から、送信者から送られてきた情報が得られます。
 
引数は、可変引数です。
 
■リスナーを登録する
 
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引数 (コネクション名)
 
好きなコネクション名を指定します。
 
『 : 』記号を含める事はできません。
 
ここでは、"MyConnection" とします。
 
送信者は、このコネクション名を、事前に知っている必要があります。
 
コネクション名は、ユニーク(唯一)である必要があります。
 
別の Flash によって既に使われている場合、失敗します。
 
この制約は、同じスーパードメイン内の Flash 同士でのみ発生します。
 
別のスーパードメインの 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 』
 
「プロトコル」「ポート番号」は含まれません。