ネットワーキングとコミュニケーションの基礎

Flash Player 9 以降、Adobe AIR 1.0 以降

Flash Player または AIR でアプリケーションを構築するときは、アプリケーションの外部のリソースにアクセスする必要が頻繁に生じます。例えば、インターネット Web サーバーにイメージの要求を送信して、返されたイメージデータを取得する場合、または、直列化されたオブジェクトを、ソケット接続経由でアプリケーションサーバーとやりとりする場合などです。Flash Player と AIR API には、アプリケーションでこのようなデータのやりとりを可能にするクラスがいくつか用意されています。これらの API は、UDP、TCP、HTTP、RTMP および RTMFP などのプロトコルに対応した IP ベースのネットワーキングをサポートしています。

次のクラスを使用すると、ネットワークを介したデータの送受信を行うことができます。

クラス

サポートしているデータ形式

プロトコル

説明

Loader

SWF、PNG、JPEG、GIF

HTTP、HTTPS

サポートしているデータ型をロードして、そのデータを表示オブジェクトに変換します。

表示コンテンツの動的ロードを参照してください。

URLLoader

任意(テキスト、XML、バイナリ、その他)

HTTP、HTTPS

任意の形式のデータをロードします。アプリケーションではデータを解釈する必要があります。

URLLoader クラスの使用を参照してください。

FileReference

任意

HTTP

ファイルをアップロードおよびダウンロードします。

FileReference クラスの使用を参照してください。

NetConnection

ビデオ、オーディオ、ActionScript メッセージ形式(AMF)

HTTP、HTTPS、RTMP、RTMFP

ビデオ、オーディオおよびリモートオブジェクトの各ストリームに接続します。

ビデオの操作を参照してください。

Sound

オーディオ

HTTP

サポートしているオーディオ形式をロードして再生します。

外部のサウンドファイルの読み込みを参照してください。

XMLSocket

XML

TCP

XMLSocket サーバーと XML メッセージをやりとりします。

XML ソケットを参照してください。

Socket

任意

TCP

TCP ソケットサーバーに接続します。

バイナリクライアントソケットを参照してください。

SecureSocket(AIR)

任意

TCP SSLv3 または TCP TLSv1

SSL または TLS セキュリティが要求される TCP ソケットサーバーに接続します。

セキュアなクライアントソケット(AIR)を参照してください。

ServerSocket(AIR)

任意

TCP

着信 TCP ソケット接続用のサーバーとして機能します。

サーバーソケットを参照してください。

DatagramSocket(AIR)

任意

UDP

UDP パケットを送受信します。

UDP ソケット(AIR)を参照してください。

通常、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 で使用するには、次のようにします。

  1. ファイル/パブリッシュ設定を選択します。

  2. ActionScript 3.0 の「設定」ボタンをクリックし、「ライブラリパス」を選択します。

  3. 「SWCファイル を参照」ボタンをクリックし、Flash Professional のインストール先フォルダーの AIK フォルダーを参照します。

  4. このフォルダー内で、/frameworks/libs/air/aircore.swc(AIR 2 の場合)または /frameworks/libs/air/servicemonitor.swc(AIR 1.5 の場合)を見つけます。

  5. 「OK」ボタンをクリックします。

  6. 次の 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 リソースレコードのタイプを以下に示します。

  • ARecord - ホストの IPv4 アドレス

  • AAAARecord - ホストの IPv6 アドレス

  • MXRecord - ホストのメール交換レコード

  • PTRRecord - IP アドレスのホスト名

  • SRVRecord - サービスのサービスレコード

レコードをルックアップするには、クエリ文字列とレコードタイプを表すクラスオブジェクトを 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 ); 
        } 
    } 
}

詳しくは、以下を参照してください。