Principes de base de la mise en réseau et de la communication

Flash Player 9 et les versions ultérieures, Adobe AIR 1.0 et les versions ultérieures

Lorsque vous créez des applications dans Flash Player ou AIR, il est souvent nécessaire d’accéder à des ressources externes. Vous pouvez, par exemple, demander une image à un serveur Web Internet et obtenir en retour les données correspondantes. Vous pouvez également échanger des objets sérialisés avec un serveur d’applications via une connexion socket. Les API de Flash Player et d’AIR proposent plusieurs classes qui permettent aux applications de participer à cet échange. Elles prennent en charge la mise en réseau IP pour les protocoles tels qu’UDP, TCP, HTTP, RTMP et RTMFP.

Les classes suivantes permettent d’envoyer et de recevoir des données via un réseau :

Classe

Formats de données pris en charge

Protocoles

Description

Loader

SWF, PNG, JPEG, GIF

HTTP, HTTPS

Charge les types de données pris en charge et convertit les données en objet d’affichage.

Voir Chargement dynamique du contenu d’affichage .

URLLoader

Tous les formats (texte, XML, binaire, etc.)

HTTP, HTTPS

Charge les formats de données arbitraires. L’application est responsable de l’interprétation des données.

Voir Utilisation de la classe URLLoader

FileReference

Tous les formats

HTTP

Charge et télécharge les fichiers.

Voir Utilisation de la classe FileReference

NetConnection

Vidéo, audio, AMF (ActionScript Message Format)

HTTP, HTTPS, RTMP, RTMFP

Etablit une connexion aux flux vidéo, audio et d’objets distants.

Voir Utilisation de la vidéo .

Sound

Audio

HTTP

Charge et lit les formats audio pris en charge.

Voir Chargement de fichiers audio externes

XMLSocket

XML

TCP

Echange des messages XML avec un serveur XMLSocket.

Voir Sockets XML .

Socket

Tous les formats

TCP

Etablit une connexion à un serveur socket TCP.

Voir Sockets clients binaires .

SecureSocket (AIR)

Tous les formats

TCP avec SSLv3 ou TLSv1

Etablit une connexion à un serveur socket TCP qui requiert une sécurité SSL ou TLS.

Voir Sockets de client sécurisés (AIR)

ServerSocket (AIR)

Tous les formats

TCP

Sert de serveur aux connexions socket TCP entrantes.

Voir Sockets de serveur .

DatagramSocket (AIR)

Tous les formats

UDP

Envoie et reçoit des paquets UDP.

Voir Sockets UDP (AIR)

Lors de la création d’une application Web, il s’avère souvent utile de stocker les informations persistantes relatives à l’état de l’application de l’utilisateur. Les applications et pages HTML utilisent généralement des cookies à cet effet. Dans Flash Player, l’utilisation de la classe SharedObject mène à un résultat identique. Voir Objets partagés . (Vous pouvez utiliser la classe SharedObject dans les applications AIR, mais se contenter d’enregistrer les données dans un fichier standard donne lieu à moins de restrictions.)

Lorsque l’application Flash Player ou AIR doit communiquer avec une autre application Flash Player ou AIR sur le même ordinateur, vous pouvez faire appel à la classe LocalConnection. Deux processus SWF ou plus hébergés sur la même page Web peuvent ainsi communiquer entre eux. Un processus SWF qui s’exécute sur une page Web peut de même communiquer avec une application AIR. Voir Communications avec d’autres occurrences de Flash Player et d’AIR

Pour communiquer avec d’autres processus non-SWF sur l’ordinateur local, vous disposez de la classe NativeProcess intégrée à AIR 2. La classe NativeProcess permet à l’application AIR de démarrer et de communiquer avec d’autres applications. Voir Communication avec les processus natifs dans AIR

Les classes suivantes permettent d’obtenir des informations sur l’environnement réseau de l’ordinateur sur lequel s’exécute une application AIR :

Concepts importants et terminologie

La liste de référence suivante contient des termes importants relatifs à la programmation de code de mise en réseau et de communication :

Données externes
Données stockées sous une certaine forme en dehors de l’application et chargées dans cette dernière si besoin est. Ces données peuvent être stockées dans un fichier chargé directement, dans une base de données ou sous une autre forme récupérée en appelant des scripts ou des programmes exécutés sur un serveur.

Variables codées URL
Le format codé URL permet de représenter plusieurs variables (paires de valeurs et de noms de variable) dans une seule chaîne de texte. Les variables individuelles sont écrites dans le format nom=valeur. Chaque variable (c’est-à-dire, chaque paire nom-valeur) est séparée par un caractère esperluette, comme suit : variable1=valeur1&variable2=valeur2. De cette façon, un nombre infini de variables peut être envoyé sous la forme d’un seul message.

Type MIME
Code standard utilisé pour identifier le type d’un fichier donné dans une communication Internet. Tous les types de fichier ont un code spécifique utilisé pour les identifier. Lors de l’envoi d’un fichier ou d’un message, un ordinateur (un serveur Web ou l’occurrence Flash Player ou AIR d’un utilisateur, par exemple) spécifie le type de fichier envoyé.

HTTP
Hypertext Transfer Protocol : format standard de livraison de pages Web et de différents types de contenu envoyés sur Internet.

Méthode de requête
Lorsqu’une application (tel un navigateur Web ou une application AIR) envoie un message (appelé requête HTTP) à un serveur Web, les données envoyées peuvent être intégrées à la requête de deux façons différentes : les méthodes de requête GET et POST. Côté serveur, le programme qui reçoit la requête doit pouvoir rechercher les données dans la portion appropriée de la requête. C’est pourquoi la méthode de requête utilisée pour envoyer des données de votre application doit correspondre à celle utilisée pour lire ces données sur le serveur.

Connexions socket
Connexion persistante pour la communication entre deux ordinateurs.

Charger
Envoyer un fichier à un autre ordinateur.

Télécharger
Récupérer un fichier d’un autre ordinateur.

Interfaces réseau

L’objet NetworkInfo permet de vérifier les interfaces matérielles et logicielles réseau dont dispose l’application. Puisqu’il s’agit d’un objet singleton , il est inutile de le créer. Accédez à l’unique objet NetworkInfo par le biais de la propriété de classe statique networkInfo . L’objet NetworkInfo distribue également un événement networkChange en cas de modification de l’une des interfaces disponibles.

Appelez la méthode findInterfaces() pour obtenir la liste des objets NetworkInterface. Chaque objet NetworkInterface de la liste décrit l’une des interfaces disponibles. L’objet NetworkInterface fournit des informations telles que l’adresse IP, l’adresse matérielle, l’unité maximale de transmission et indique si l’interface est active.

L’exemple de code suivant effectue le suivi des propriétés NetworkInterface de chaque interface sur l’ordinateur client :

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 ); 
                } 
            }             
        } 
    }     
} 
}

Pour plus d’informations, voir :

Changements de connectivité réseau

Votre application AIR peut s’exécuter dans des environnements caractérisés par une connectivité réseau non déterminée et en évolution constante. Pour aider une application à gérer les connexions aux ressources en ligne, Adobe AIR envoie un événement de changement réseau à chaque fois qu’une connexion réseau est disponible ou non disponible. L’objet NetworkInfo et l’objet NativeApplication de l’application distribuent tous deux l’événement networkChange . Pour répondre à cet événement, ajoutez un écouteur :

NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); 

Définissez également une fonction de gestionnaire d’événement :

function onNetworkChange(event:Event) 
{ 
    //Check resource availability 
} 

L’événement networkChange n’indique pas un changement de l’activité réseau globale. Il se contente de signaler qu’une connexion réseau donnée a changé. AIR ne tente pas d’interpréter la signification du changement réseau. Un ordinateur connecté au réseau étant susceptible de disposer d’un nombre élevé de connexions réelles et virtuelles, perdre une connexion ne signifie pas nécessairement perdre une ressource. A l’inverse, une nouvelle connexion n’est pas non plus synonyme de disponibilité accrue des ressources. Il arrive qu’une nouvelle connexion bloque l’accès à des ressources précédemment disponibles (lors d’une connexion à un VPN, par exemple).

En règle générale, l’unique façon de déterminer si une application peut se connecter à une ressource distante consiste à en faire l’essai. La structure de surveillance des services propose une technique orientée événement de réponse aux changements de connectivité réseau vers un hôte déterminé.

Remarque : la structure de surveillance des services détecte si un serveur répond de manière acceptable à une requête. Le succès du contrôle n’est pas synonyme de connectivité totale. Les services Web évolutifs proposent souvent des dispositifs de mise en cache et d’équilibrage de charge destinés à réorienter le trafic vers un groupe de serveurs Web. Dans ce cas de figure, les prestataires de services n’assurent qu’un diagnostic partiel de la connectivité réseau.

Surveillance des services

La structure de surveillance des services, distincte de la structure AIR, réside dans le fichier aircore.swc. Pour pouvoir utiliser la structure, le fichier aircore.swc doit être inclus dans le processus de compilation.

Adobe® Flash® Builder inclut automatiquement cette bibliothèque.

La classe ServiceMonitor met en œuvre la structure de surveillance des services réseau et propose des fonctionnalités de base aux utilitaires de surveillance des services. Par défaut, une occurrence de la classe ServiceMonitor distribue des événements relatifs à la connectivité réseau. L’objet ServiceMonitor distribue ces événements lors de la création de l’occurrence et lorsque le moteur d’exécution détecte un changement au sein du réseau. Par ailleurs, vous pouvez définir la propriété pollInterval d’une occurrence de ServiceMonitor de sorte à vérifier la connectivité à fréquence déterminée exprimée en millisecondes, sans tenir compte des événements de connectivité réseau généraux. Un objet ServiceMonitor ne vérifie pas la connectivité réseau tant que la méthode start() n’a pas été appelée.

La classe URLMonitor, une sous-classe de la classe ServiceMonitor, détecte les changements de connectivité HTTP associés à une requête URLRequest déterminée.

La classe SocketMonitor, également une sous-classe de la classe ServiceMonitor, détecte les changements de connectivité vers un hôte déterminé sur un port donné.

Remarque : dans les versions antérieures à AIR 2, la structure de surveillance des services était publiée dans la bibliothèque servicemonitor.swc. L’utilisation de cette bibliothèque est à présent déconseillée. Utilisez plutôt la bibliothèque aircore.swc.

Flash CS4 et CS5 Professional

Pour utiliser ces classes dans Adobe® Flash® CS4 ou CS5 Professional :

  1. Choisissez Fichier > Paramètres de publication.

  2. Cliquez sur le bouton Paramètres pour ActionScript 3.0. Sélectionnez Chemin de la bibliothèque.

  3. Cliquez sur le bouton Localiser le fichier SWC et accédez au dossier AIK dans le dossier d’installation de Flash Professional.

  4. Dans ce dossier, recherchez le fichier /frameworks/libs/air/aircore.swc (AIR 2) ou /frameworks/libs/air/servicemonitor.swc (AIR 1.5).

  5. Cliquez sur le bouton OK.

  6. Ajoutez l’instruction d’importation suivante dans votre code ActionScript 3.0 :
    import air.net.*;

Flash CS3 Professional

Pour utiliser ces classes dans Adobe® Flash® CS3 Professional, faites glisser le composant ServiceMonitorShim du panneau Composants vers la bibliothèque. Ajoutez ensuite l’instruction import suivante au code ActionScript 3.0 :

import air.net.*;

Surveillance HTTP

La classe URLMonitor détermine s’il est possible d’envoyer des requêtes HTTP à une adresse déterminée sur le port 80 (qui est généralement utilisé par les communications HTTP). Le code suivant utilise une occurrence de la classe URLMonitor pour détecter les changements de connectivité vers le site Web d’Adobe :

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); 
}

Surveillance des sockets

Les applications AIR peuvent également utiliser les connexions de socket pour assurer la connectivité de type « push ». Pour des raisons de sécurité, les pare-feu et routeurs réseau interdisent généralement les communications réseau sur les ports non autorisés. Les développeurs doivent donc tenir compte du fait que les utilisateurs ne sont pas toujours à même d’établir des connexions de socket.

Le code suivant utilise une occurrence de la classe SocketMonitor pour détecter les changements de connectivité vers une connexion de socket : Le port surveillé, 6667, est un port courant pour 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); 
} 

Si le serveur socket requiert une connexion sécurisée, utilisez la classe SecureSocketMonitor au lieu de SocketMonitor.

Enregistrements DNS (Domain Name System)

La classe DNSResolver permet de consulter les enregistrements de ressource DNS. Les enregistrements de ressource DNS fournissent des informations telles que l’adresse IP d’un nom de domaine et le nom de domaine d’une adresse IP. Vous pouvez consulter les types suivants d’enregistrements de ressources DNS :

  • ARecord : adresse IPv4 d’un hôte

  • AAAARecord : adresse IPv6 d’un hôte

  • MXRecord : enregistrement d’échange de courrier associé à un hôte

  • PTRRecord : nom d’hôte associé à une adresse IP

  • SRVRecord : enregistrement associé à un service.

Pour consulter un enregistrement, transmettez une chaîne de requête et l’objet de classe représentant le type d’enregistrement à la méthode lookup() de l’objet DNSResolver. La chaîne de requête à utiliser varie selon le type d’enregistrement :

Classe d’enregistrement

Chaîne de requête

Exemple de chaîne de requête

ARecord

nom d’hôte

« example.com »

AAAARecord

nom d’hôte

« example.com »

MXRecord

nom d’hôte

« example.com »

PTRRecord

Adresse IP

« 208.77.188.166 »

SRVRecord

Identifiant de service : _service._protocole.hôte

« _sip._tcp.example.com »

L’exemple de code suivant recherche l’adresse IP de l’hôte « example.com ».

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 ); 
        } 
    } 
}

Pour plus d’informations, voir :