Nozioni fondamentali sulla connettività di rete e le comunicazioni

Flash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive

Quando create applicazioni in Flash Player o AIR, spesso avete bisogno di accedere a risorse esterne all'applicazione. Ad esempio, potreste inviare una richiesta per un'immagine a un server Web Internet e ottenere in risposta i dati immagine. Oppure, potreste inviare oggetti serializzati avanti e indietro su una connessione socket con un server applicazione. Le API Flash Player e AIR forniscono diverse classi che consentono alle applicazioni di partecipare in questo scambio. Queste API supportano la connettività di rete basata su IP per protocolli quali UDP, TCP, HTTP, RTMP e RTMFP.

Le classi seguenti possono essere utilizzate per inviare e ricevere dati su una rete:

Classe

Formati di dati supportati

Protocolli

Descrizione

Loader

SWF, PNG, JPEG, GIF

HTTP, HTTPS

Carica tipi di dati supportati e converte i dati in un oggetto di visualizzazione.

Vedete Caricamento dinamico di contenuto di visualizzazione

URLLoader

Qualsiasi (testo, XML, binario e così via)

HTTP, HTTPS

Carica formati di dati arbitrari. L'applicazione è responsabile per l'interpretazione dei dati.

Vedete Uso della classe URLLoader

FileReference

Qualsiasi

HTTP

Consente di caricare e scaricare file.

Vedete Uso della classe FileReference

NetConnection

Video, audio, ActionScript Message Format (AMF)

HTTP, HTTPS, RTMP, RTMFP

Consente la connessione a flussi video, audio e oggetti remoti.

Vedete Operazioni con i file video.

audio

Audio

HTTP

Carica e riproduce formati audio supportati.

Vedete Caricamento di file audio esterni

XMLSocket

XML

TCP

Scambia messaggi XML con un server XMLSocket.

Vedete Socket XML.

Socket

Qualsiasi

TCP

Consente la connessione a un server socket TCP.

Vedete Socket client binari.

SecureSocket (AIR)

Qualsiasi

TCP con SSLv3 o TLSv1

Consente la connessione a un server socket TCP che richiede la protezione SSL o TLS.

Vedete Socket client sicuri (AIR)

ServerSocket (AIR)

Qualsiasi

TCP

Agisce come un server per le connessioni socket TCP in entrata.

Vedete Socket server.

DatagramSocket (AIR)

Qualsiasi

UDP

Invia e riceve pacchetti UDP.

Vedete Socket UDP (AIR)

Spesso, durante la creazione di un'applicazione Web è utile memorizzare informazioni persistenti sullo stato applicazione dell'utente. Le pagine e le applicazioni HTML utilizzano in genere cookie per questo scopo. In Flash Player, potete utilizzare la classe SharedObject per lo stesso scopo. Vedete Oggetti condivisi. (La classe SharedObject può essere utilizzata nelle applicazioni AIR, ma il numero di limitazioni è inferiore quando si salvano semplicemente i dati in un file normale.)

Quando l'applicazione Flash Player o AIR deve comunicare con un'altra applicazione Flash Player o AIR sullo stesso computer, potete utilizzare la classe LocalConnection. Ad esempio, due (o più) file SWF sulla stessa pagina Web possono comunicare tra loro. Analogamente, un file SWF in esecuzione su una pagina Web può comunicare con un'applicazione AIR. Vedete Comunicazione con altre istanze di Flash Player e Adobe AIR.

Quando dovete comunicare con altri processi non SWF sul computer locale, potete utilizzare la classe NativeProcess aggiunta in AIR 2. La classe NativeProcess consente all'applicazione AIR di avviare e comunicare con altre applicazioni. Vedete Comunicazione con processi nativi in AIR.

Quando vi occorrono informazioni sull'ambiente di rete del computer su cui è in esecuzione un'applicazione AIR, potete utilizzare le classi seguenti:

  • NetworkInfo: fornisce informazioni sulle interfacce di rete disponibili, ad esempio l'indirizzo IP del computer. Vedete Interfacce di rete.

  • DNSResolver: consente di ricercare record DNS. Vedete Record DNS (Domain Name System).

  • ServiceMonitor: consente di monitorare la disponibilità di un server. Vedete Monitoraggio dei servizi.

  • URLMonitor: consente di monitorare la disponibilità di una risorsa su un particolare URL. Vedete Monitoraggio HTTP.

  • SocketMonitor e SecureSocketMonitor: consentono di monitorare la disponibilità di una risorsa su un socket. Vedete Monitoraggio Socket.

Concetti e termini importanti

L'elenco di riferimento seguente contiene termini importanti che vengono citati durante la programmazione del codice di rete e di comunicazione:

Dati esterni
Dati archiviati in qualche forma al di fuori dell'applicazione e caricati nell'applicazione quando necessario. Questi dati possono essere memorizzati in un file che viene caricato direttamente oppure possono essere memorizzati in un database o in un'altra forma che può essere recuperata chiamando script o programmi in esecuzione su un server.

Variabili con codifica URL
Il formato con codifica URL fornisce un metodo per rappresentare diverse variabili (coppie di nomi-valori) in un'unica stringa di testo. Le singole variabili sono scritte nel formato nome=valore. Ogni variabile (ovvero, ogni coppia nome-valore) è separata mediante caratteri e commerciale, come nel caso seguente: variabile1=valore1&variabile2=valore2. Ciò consente di inviare un numero indefinito di variabili con un singolo messaggio.

Tipo MIME
Un codice standard utilizzato per identificare il tipo di un determinato file nelle comunicazioni Internet. Qualunque tipo di file ha un codice specifico che viene utilizzato per identificarlo. Quando si invia un file o un messaggio, un computer (ad esempio, un server Web o l'istanza di Flash Player di un utente) specifica il tipo di file che è in corso di invio.

HTTP
Acronimo di Hypertext Transfer Protocol, un formato standard per la distribuzione di pagine Web e vari altri tipi di contenuti inviati su Internet.

Metodo di richiesta
Quando un'applicazione, ad esempio un'applicazione AIR o un browser Web, invia un messaggio (definito anche richiesta HTTP) a un server Web, qualunque dato inviato può essere incorporato nella richiesta utilizzando due metodi di richiesta definiti GET e POST. Sul lato server, il programma che riceve la richiesta deve cercare i dati nella porzione appropriata della richiesta, pertanto il metodo di richiesta utilizzato per l'invio dei dati dall'applicazione deve corrispondere a quello utilizzato per leggere i dati sul server.

Connessione socket
Una connessione persistente che consente la comunicazione tra due computer.

Caricamento
L'invio di un file a un altro computer.

Scaricamento
Il recupero di un file da un altro computer.

Interfacce di rete

Potete utilizzare l'oggetto NetworkInfo per rilevare le interfacce di rete hardware e software disponibili nell'applicazione. L'oggetto NetworkInfo è un oggetto singleton, non è necessario crearne uno. Invece, utilizzate la proprietà di classe statica, networkInfo, per accedere al singolo oggetto NetworkInfo. L'oggetto NetworkInfo invia inoltre un evento networkChange quando una delle interfacce disponibili cambia.

Chiamate il metodo findInterfaces() per ottenere l'elenco degli oggetti NetworkInterface. Ogni oggetto NetworkInterface nell'elenco descrive una delle interfacce disponibili. L'oggetto NetworkInterface fornisce informazioni quali l'indirizzo IP, l'indirizzo hardware, l'MTU (maximum transmission unit)e se l'interfaccia è attiva.

Il codice di esempio seguente traccia le proprietà NetworkInterface di ciascuna interfaccia sul computer 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 ); 
                } 
            }             
        } 
    }     
} 
}

Per ulteriori informazioni, vedete:

Modifiche della connettività di rete

È possibile che la vostra applicazione AIR sia eseguita in ambienti caratterizzati da una connettività di rete incerta e mutevole. Per agevolare la gestione delle connessioni alle risorse online da parte di un'applicazione, Adobe AIR invia un evento modifica di rete ogni volta che una connessione di rete diventa disponibile o cessa di esserlo. L'oggetto NetworkInfo e l'oggetto NativeApplication dell'applicazione inviano entrambi l'evento networkChange. In risposta a questo evento, aggiungete un listener:

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

E definite una funzione gestore eventi:

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

L'evento networkChange non segnala una modifica relativa a tutta l'attività della rete, ma solo che una singola connessione di rete è cambiata. AIR non tenta di interpretare il significato della modifica di rete. È possibile che un computer della rete disponga di svariate connessioni reali e virtuali, pertanto la perdita di una connessione non comporta necessariamente la perdita una risorsa. D'altro canto, neppure le nuove connessioni garantiscono una migliore disponibilità delle risorse. Talvolta una nuova connessione può persino bloccare l'accesso a risorse che in precedenza erano disponibili (è il caso, ad esempio, di una connessione a una rete privata virtuale o VPN).

In genere un'applicazione ha un solo modo per scoprire se può o meno stabilire una connessione con una risorsa remota: tentare di connettersi. Il framework di monitoraggio dei servizi offre un metodo basato su eventi per rispondere alle modifiche nella connettività di rete per un host specifico.

Nota: il framework di monitoraggio dei servizi determina se la risposta di un server a una richiesta è accettabile o meno. Una verifica corretta non garantisce piena connettività. I servizi Web scalabili usano spesso strumenti per la creazione di cache e di bilanciamento del carico che consentono di reindirizzare il traffico verso un cluster di server Web. In questa situazione, i provider di servizi offrono una diagnosi soltanto parziale della connettività di rete.

Monitoraggio dei servizi

Il framework di monitoraggio dei servizi, che è indipendente dal framework AIR, risiede nel file aircore.swc. Per usare il framework, è necessario che il file aircore.swc sia incluso nel processo di creazione.

Adobe® Flash® Builder include questa libreria automaticamente.

La classe ServiceMonitor implementa il framework per il monitoraggio dei servizi di rete e costituisce una funzionalità di base per i monitor di servizi. Per impostazione predefinita, un'istanza della classe ServiceMonitor invia gli eventi riguardanti la connettività di rete. L'oggetto ServiceMonitor invia questi eventi quando viene creata l'istanza e ogni volta che il runtime rileva una modifica di rete. È inoltre possibile impostare la proprietà pollInterval di un'istanza ServiceMonitor in modo tale che la connettività di rete venga controllata a intervalli regolari, espressi in millisecondi, indipendentemente dagli eventi relativi alla connettività di rete generale. Un oggetto ServiceMonitor non controlla la connettività di rete finché non viene chiamato il metodo start().

URLMonitor, una sottoclasse della classe ServiceMonitor, rileva le modifiche della connettività HTTP per uno specifico oggetto URLRequest.

SocketMonitor, anch'essa una sottoclasse della classe ServiceMonitor, rileva le modifiche della connettività con un host specifico su una porta specifica.

Nota: nelle versioni precedenti a AIR 2, il framework di monitoraggio dei servizi era pubblicato nella libreria servicemonitor.swc. Questa libreria è ora sconsigliata. Utilizzate invece la libreria aircore.swc.

Flash CS4 e CS5 Professional

Per utilizzare queste classi in Adobe® Flash® CS4 o CS5 Professional:

  1. Selezionate il comando File > Impostazioni pubblicazione.

  2. Fate clic sul pulsante Impostazioni per ActionScript 3.0. Selezionate Percorso di libreria.

  3. Fate clic sul pulsante Sfoglia e passate alla cartella AIK nella cartella di installazione di Flash Professional.

  4. All'interno di questa cartella, individuate /frameworks/libs/air/aircore.swc (per AIR 2) o /frameworks/libs/air/servicemonitor.swc (per AIR 1.5).

  5. Fate clic sul pulsante OK.

  6. Aggiungete le istruzioni import seguenti al codice ActionScript 3.0:
    import air.net.*;

Flash CS3 Professional

Per usare queste classi in Adobe® Flash® CS3 Professional, trascinate il componente ServiceMonitorShim dal pannello Componenti al pannello Libreria, quindi aggiungete la seguente istruzione import al codice ActionScript 3.0:

import air.net.*;

Monitoraggio HTTP

La classe URLMonitor determina se le richieste HTTP possono essere effettuate a un indirizzo specifico sulla porta 80 (la porta tradizionalmente usata per le comunicazioni HTTP). Nel codice seguente viene usata un'istanza della classe URLMonitor per rilevare le modifiche della connettività al sito Web 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); 
}

Monitoraggio Socket

Le applicazioni AIR possono usare anche le connessioni socket per la connettività di modello push. In genere, per motivi di sicurezza, i firewall e i router di rete limitano la comunicazione in rete sulle porte non autorizzate. Gli sviluppatori dovranno dunque considerare che gli utenti non sempre hanno la possibilità di effettuare connessioni socket.

Nel codice seguente viene usata un'istanza della classe SocketMonitor per rilevare le modifiche della connettività per una connessione socket. La porta monitorata è 6667, una porta comune per 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); 
} 

Se il server socket richiede una connessione protetta, potete utilizzare la classe SecureSocketMonitor anziché SocketMonitor.

Record DNS (Domain Name System)

Potete cercare record di risorse DNS utilizzando la classe DNSResolver. I record di risorse DNS forniscono informazioni come l'indirizzo IP di un nome di dominio e il nome di dominio di un indirizzo IP. Potete ricercare i tipi seguenti di record di risorse DNS:

  • ARecord: indirizzo IPv4 per in host.

  • ARecord: indirizzo IPv6 per un host.

  • MXRecord: record mail exchange per un host.

  • PTRRecord: nome host per un indirizzo IP.

  • SRVRecord: record di servizio per un servizio.

Per ricercare un record, passate una stringa di query e l'oggetto classe che rappresenta il tipo di record al metodo lookup() dell'oggetto DNSResolver. La stringa di query da utilizzare dipende dal tipo di record:

Classe record

Stringa di query

Esempio di stringa di query

ARecord

nome host

“example.com”

AAAARecord

nome host

“example.com”

MXRecord

nome host

“example.com”

PTRRecord

indirizzo IP

“208.77.188.166”

SRVRecord

Identificatore servizio: _service._protocol.host

“_sip._tcp.example.com”

Il codice di esempio seguente ricerca l'indirizzo IP dell'host “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 ); 
        } 
    } 
}

Per ulteriori informazioni, vedete: