ネットワーキングとコミュニケーションの基礎
Flash Player 9 以降、Adobe AIR 1.0 以降
Flash Player または AIR でアプリケーションを構築するときは、アプリケーションの外部のリソースにアクセスする必要が頻繁に生じます。例えば、インターネット Web サーバーにイメージの要求を送信して、返されたイメージデータを取得する場合、または、直列化されたオブジェクトを、ソケット接続経由でアプリケーションサーバーとやりとりする場合などです。Flash Player と AIR API には、アプリケーションでこのようなデータのやりとりを可能にするクラスがいくつか用意されています。これらの API は、UDP、TCP、HTTP、RTMP および RTMFP などのプロトコルに対応した IP ベースのネットワーキングをサポートしています。
次のクラスを使用すると、ネットワークを介したデータの送受信を行うことができます。
通常、Web アプリケーションを作成する場合は、ユーザーのアプリケーションの状態に関する永続的な情報を格納しておくと便利です。一般的に、HTML ページとアプリケーションでは Cookie を使用してこれに対応します。Flash Player の場合は、SharedObject クラスを使用できます。
共有オブジェクト
を参照してください(AIR アプリケーションでは SharedObject クラスを使用できますが、データを通常のファイルに保存するだけの方が、制限は少なくなります)。
同一コンピューター上で、Flash Player または AIR アプリケーションが別の Flash Player または AIR アプリケーションと通信する必要がある場合は、LocalConnection クラスを使用できます。例えば、同じ Web ページ上にある 2 つ(以上)の SWF は相互に通信できます。同様に、Web ページ上で実行している SWF は AIR アプリケーションと通信できます。
Flash Player および AIR の他のインスタンスとの通信
を参照してください。
ローカルコンピューター上で、SWF 以外の他のプロセスと通信する必要がある場合は、AIR 2 で追加された NativeProcess クラスを使用できます。NativeProcess クラスを使用すると、AIR アプリケーションは他のアプリケーションを起動して通信することができます。
AIR のネイティブプロセスとの通信
を参照してください。
AIR アプリケーションが動作しているコンピューターのネットワーク環境に関する情報が必要な場合は、次のクラスを使用できます。
-
NetworkInfo - 利用可能なネットワークインターフェイスの情報(コンピューターの IP アドレスなど)を提供します。
ネットワークインターフェイス
を参照してください。
-
DNSResolver - DNS レコードのルックアップを可能にします。
ドメインネームシステム(DNS)レコード
を参照してください。
-
ServiceMonitor — サーバーの可用性を監視できます。
サービス監視
を参照してください。
-
URLMonitor — 特定の URL におけるリソースの可用性を監視できます。
HTTP 監視
を参照してください。
-
SocketMonitor および SecureSocketMonitor - ソケットにおけるリソースの可用性を監視できます。
ソケット監視
を参照してください。
重要な概念と用語
次の参照リストに、ネットワーキングおよび通信に関するコードのプログラミングで使用される重要な用語を示します。
-
外部データ
-
アプリケーションの外部に何らかの形式で保存され、必要に応じてアプリケーションに読み込まれるデータです。このデータは、直接ロードされるファイル内に格納したり、データベース内、またはサーバー上で実行中のプログラムやスクリプトを呼び出すことで取得可能なその他の形式で格納することができます。
-
URL エンコード形式の変数
-
URL エンコード形式を使用すると、複数の変数(変数の名前と値のペア)を 1 つのテキストストリングで表現できます。各変数は、name=value という形式で記述されます。各変数(名前と値の各ペア)は、variable1=value1&variable2=value2 のように、アンパサンド文字で区切られます。このように、任意の数の変数を 1 つのメッセージとして送信できます。
-
MIME タイプ
-
インターネット通信において特定のファイルの種類を識別するために使用される標準コードです。ファイルの種類にはそれぞれ、識別に使用される特定のコードがあります。ファイルやメッセージの送信時、Web サーバーやユーザーの Flash Player または AIR インスタンスなどのコンピューターが、送信するファイルのタイプを指定します。
-
HTTP
-
インターネットを介して送信される Web ページやその他の様々なタイプのコンテンツを配信するための標準形式であるハイパーテキスト転送プロトコルです。
-
要求メソッド
-
AIR アプリケーションや Web ブラウザーなどのアプリケーションが HTTP リクエストと呼ばれるメッセージを Web サーバーに送信するとき、送信されるデータはすべて 2 つの方法のいずれかでリクエスト内に埋め込まれます。この 2 つのリクエストメソッドとは、GET および POST です。サーバー側で、リクエストを受信するプログラムはリクエストの該当箇所を確認してデータを探す必要があります。そのため、アプリケーションからのデータの送信に使用するリクエストメソッドは、サーバーでそのデータの読み取りに使用するリクエストメソッドと一致している必要があります。
-
ソケット接続
-
2 台のコンピューター間での通信に使用される永続的な接続です。
-
アップロード
-
他のコンピューターにファイルを送信すること。
-
ダウンロード
-
他のコンピューターからファイルを取得すること。
ネットワークインターフェイス
NetworkInfo オブジェクトを使用すると、アプリケーションで使用できるハードウェアおよびソフトウェアのネットワークインターフェイスを検出できます。NetworkInfo オブジェクトは「シングルトン」オブジェクトで、作成する必要はありません。代わりに、静的クラスプロパティ
networkInfo
を使用して、NetworkInfo シングルトンオブジェクトにアクセスします。また、NetworkInfo オブジェクトは、使用可能なインターフェイスのいずれかが変更されると、
networkChange
イベントを送出します。
NetworkInterface オブジェクトのリストを取得するには、
findInterfaces()
メソッドを呼び出します。リストには NetworkInterface オブジェクトごとに、使用可能なインターフェイスの 1 つが記載されています。NetworkInterface オブジェクトでは、IP アドレス、ハードウェアアドレス、最大転送ユニット、インターフェイスの稼働状況などに関する情報を提供します。
次のコード例では、クライアントコンピューター上で各インターフェイスの NetworkInterface プロパティをトレースします。
package {
import flash.display.Sprite;
import flash.net.InterfaceAddress;
import flash.net.NetworkInfo;
import flash.net.NetworkInterface;
public class NetworkInformationExample extends Sprite
{
public function NetworkInformationExample()
{
var networkInfo:NetworkInfo = NetworkInfo.networkInfo;
var interfaces:Vector.<NetworkInterface> = networkInfo.findInterfaces();
if( interfaces != null )
{
trace( "Interface count: " + interfaces.length );
for each ( var interfaceObj:NetworkInterface in interfaces )
{
trace( "\nname: " + interfaceObj.name );
trace( "display name: " + interfaceObj.displayName );
trace( "mtu: " + interfaceObj.mtu );
trace( "active?: " + interfaceObj.active );
trace( "parent interface: " + interfaceObj.parent );
trace( "hardware address: " + interfaceObj.hardwareAddress );
if( interfaceObj.subInterfaces != null )
{
trace( "# subinterfaces: " + interfaceObj.subInterfaces.length );
}
trace("# addresses: " + interfaceObj.addresses.length );
for each ( var address:InterfaceAddress in interfaceObj.addresses )
{
trace( " type: " + address.ipVersion );
trace( " address: " + address.address );
trace( " broadcast: " + address.broadcast );
trace( " prefix length: " + address.prefixLength );
}
}
}
}
}
}
詳しくは、以下を参照してください。
ネットワーク接続の変更
AIR アプリケーションは、ネットワーク接続が一定ではなく変化する環境で実行できます。アプリケーションでオンラインリソースに対する接続を管理できるように、Adobe AIR では、ネットワーク接続が使用できるようになったり使用できなくなったりするたびにネットワーク変更イベントが送信されます。NetworkInfo オブジェクトおよびアプリケーションの NativeApplication オブジェクトは両方とも
networkChange
イベントを送出します。このイベントに対処するには、リスナーを追加します。
NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANGE, onNetworkChange);
さらに、イベントハンドラー関数を定義します。
function onNetworkChange(event:Event)
{
//Check resource availability
}
networkChange
イベントは、ネットワーク活動全体の変更ではなく、個々のネットワーク接続の変更のみを示します。AIR では、ネットワークが変更された意味については解釈されません。ネットワークに接続されたコンピューターには実際の接続や仮想接続が多数存在できるので、1 つの接続が切断されても必ずしもリソースが失われるわけではありません。一方、新しい接続でも、リソースの可用性の向上が保証されるわけではありません。新しい接続によって、それまで使用できていたリソースへのアクセスがブロックされることもあります(例えば、VPN に接続する場合など)。
一般に、アプリケーションでリモートリソースに接続できるかどうかを確認するには、試してみるしかありません。サービス監視フレームワークには、特定のホストに対するネットワーク接続が変更された場合に、イベントに基づいて応答する方法が用意されています。
注意:
サービス監視フレームワークでは、サーバーで要求が受け入れられたかどうかが検出されます。良好な結果が確認されても、完全な接続が保証されるわけではありません。拡張可能な Web サービスでは、多くの場合、キャッシュ装置や負荷分散装置を使用して、Web サーバーのクラスタに対するトラフィックにリダイレクトしています。この場合、サービスプロバイダーによって、ネットワーク接続の部分的な診断のみが提供されます。
サービス監視
サービス監視フレームワークは、AIR フレームワークとは別に、aircore.swc ファイルに含まれています。このフレームワークを使用するには、aircore.swc ファイルがビルドプロセスで組み込まれる必要があります。
Adobe® Flash® Builder では、このライブラリが自動的に組み込まれます。
ServiceMonitor クラスでは、ネットワークサービスを監視するためのフレームワークを実装し、サービス監視の基本的な機能を提供します。デフォルトでは、ServiceMonitor クラスのインスタンスから、ネットワーク接続に関するイベントが送出されます。ServiceMonitor オブジェクトでは、インスタンスの作成時やランタイムでネットワークの変更が検出されるたびに、これらのイベントを送出します。さらに、ServiceMonitor インスタンスの
pollInterval
プロパティを設定すると、通常のネットワーク接続イベントに関係なく、指定した間隔(ミリ秒)で接続を確認することができます。ServiceMonitor オブジェクトによるネットワーク接続の確認は、
start()
メソッドが呼び出されるまで実行されません。
URLMonitor クラスは ServiceMonitor クラスのサブクラスで、このクラスでは、特定の URLRequest に対する HTTP 接続の変更を検出します。
SocketMonitor クラスも ServiceMonitor クラスのサブクラスで、このクラスでは、特定のポートの特定のホストに対する接続の変更を検出します。
注意:
AIR 2 以前は、サービス監視フレームワークは servicemonitor.swc ライブラリで公開されていました。現在、このライブラリは使用されません。代わりに aircore.swc ライブラリを使用します。
Flash CS4 および CS5 Professional
これらのクラスを Adobe® Flash® CS4 または CS5 Professional で使用するには、次のようにします。
-
ファイル/パブリッシュ設定を選択します。
-
ActionScript 3.0 の「設定」ボタンをクリックし、「ライブラリパス」を選択します。
-
「SWCファイル を参照」ボタンをクリックし、Flash Professional のインストール先フォルダーの AIK フォルダーを参照します。
-
このフォルダー内で、/frameworks/libs/air/aircore.swc(AIR 2 の場合)または /frameworks/libs/air/servicemonitor.swc(AIR 1.5 の場合)を見つけます。
-
「OK」ボタンをクリックします。
-
次の import ステートメントを ActionScript 3.0 コードに追加します。
import air.net.*;
Flash CS3 Professional
これらのクラスを Adobe® Flash® CS3 Professional で使用するには、ServiceMonitorShim コンポーネントをコンポーネントパネルからライブラリにドラッグします。その後で、次の
import
ステートメントを ActionScript 3.0 コードに追加します。
import air.net.*;
HTTP 監視
URLMonitor クラスでは、HTTP 要求をポート 80(HTTP 通信の一般的なポート)で特定のアドレスに送信できるかどうかを確認します。次のコードでは、URLMonitor クラスのインスタンスを使用して、アドビ システムズ社の Web サイトに対する接続の変更を検出します。
import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;
var monitor:URLMonitor;
monitor = new URLMonitor(new URLRequest('http://www.example.com'));
monitor.addEventListener(StatusEvent.STATUS, announceStatus);
monitor.start();
function announceStatus(e:StatusEvent):void {
trace("Status change. Current status: " + monitor.available);
}
ソケット監視
AIR アプリケーションでは、プッシュモデルの接続にソケット接続を使用することもできます。セキュリティ上の理由から、許可されていないポートでのネットワーク通信は、ファイアウォールやネットワークルーターによって制限されるのが一般的です。したがって、開発者は、ユーザーが常にソケット接続を実行できるとは限らないことを考慮する必要があります。
次のコードでは、SocketMonitor クラスのインスタンスを使用して、ソケット接続に対する接続の変更を検出します。監視対象のポートは 6667(IRC で一般に使用されるポート)です。
import air.net.ServiceMonitor;
import flash.events.StatusEvent;
socketMonitor = new SocketMonitor('www.example.com',6667);
socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange);
socketMonitor.start();
function announceStatus(e:StatusEvent):void {
trace("Status change. Current status: " + socketMonitor.available);
}
ソケットサーバーでセキュア接続が必要な場合は、SocketMonitor クラスの代わりに SecureSocketMonitor クラスを使用できます。
ドメインネームシステム(DNS)レコード
DNS リソースレコードのルックアップには、DNSResolver クラスを使用できます。DNS リソースレコードでは、ドメイン名の IP アドレスまたは IP アドレスのドメイン名のような情報を提供します。ルックアップ可能な DNS リソースレコードのタイプを以下に示します。
レコードをルックアップするには、クエリ文字列とレコードタイプを表すクラスオブジェクトを DNSResolver オブジェクトの
lookup()
メソッドに渡します。使用するクエリ文字列はレコードタイプによって異なります。
レコードクラス
|
クエリ文字列
|
クエリ文字列の例
|
ARecord
|
ホスト名
|
“example.com”
|
AAAARecord
|
ホスト名
|
“example.com”
|
MXRecord
|
ホスト名
|
“example.com”
|
PTRRecord
|
IP アドレス
|
“208.77.188.166”
|
SRVRecord
|
サービス識別子:_service._protocol.host
|
“_sip._tcp.example.com”
|
次のコード例では、ホスト "example.com" の IP アドレスをルックアップします。
package
{
import flash.display.Sprite;
import flash.events.DNSResolverEvent;
import flash.events.ErrorEvent;
import flash.net.dns.ARecord;
import flash.net.dns.DNSResolver;
public class DNSResolverExample extends Sprite
{
public function DNSResolverExample()
{
var resolver:DNSResolver = new DNSResolver();
resolver.addEventListener( DNSResolverEvent.LOOKUP, lookupComplete );
resolver.addEventListener( ErrorEvent.ERROR, lookupError );
resolver.lookup( "example.com.", ARecord );
}
private function lookupComplete( event:DNSResolverEvent ):void
{
trace( "Query string: " + event.host );
trace( "Record count: " + event.resourceRecords.length );
for each( var record:* in event.resourceRecords )
{
if( record is ARecord ) trace( record.address );
}
}
private function lookupError( error:ErrorEvent ):void
{
trace("Error: " + error.text );
}
}
}
詳しくは、以下を参照してください。
|
|
|