ネットワーキングとコミュニケーションの基礎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 オブジェクトを使用すると、アプリケーションで使用できるハードウェアおよびソフトウェアのネットワークインターフェイスを検出できます。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 で使用するには、次のようにします。
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() メソッドに渡します。使用するクエリ文字列はレコードタイプによって異なります。
次のコード例では、ホスト "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 ); } } } 詳しくは、以下を参照してください。 |
![]() |