Connessione ad altre istanze di Flash Player

La classe LocalConnection consente la comunicazione tra diverse istanze di Flash Player, come un file SWF in un contenitore HTML o in un lettore incorporato o autonomo. In questo modo è possibile creare applicazioni molto versatili, in grado di condividere i dati tra le istanze di Flash Player, ad esempio i file SWF in esecuzione in un browser Web o incorporati nelle applicazioni desktop.

Sezioni

Classe LocalConnection
Invio di messaggi tra due istanze di Flash Player
Connessione ai documenti SWF in domini diversi

Classe LocalConnection

La classe LocalConnection consente di sviluppare file SWF in grado di inviare istruzioni ad altri file SWF senza utilizzare il metodo fscommand() o JavaScript. Gli oggetti LocalConnection possono comunicare solo tra file SWF in esecuzione sullo stesso computer client, tuttavia possono essere eseguiti in applicazioni diverse. Ad esempio, un file SWF in esecuzione in un browser e un file SWF in esecuzione in un proiettore possono condividere le informazioni: il proiettore gestisce le informazioni locali, mentre il file SWF basato su browser si connette in remoto. Un proiettore è un file SWF salvato in un formato che può essere eseguito come applicazione autonoma, ovvero senza richiedere l'installazione di Flash Player essendo incorporato nell'eseguibile.

Gli oggetti LocalConnection possono essere utilizzati per la comunicazione tra file SWF che utilizzano versioni diverse di ActionScript:

Flash Player gestisce in modo automatico questa comunicazione tra oggetti LocalConnection di versioni diverse.

Il modo più semplice per utilizzare un oggetto LocalConnection consiste nel consentire la comunicazione solo tra gli oggetti LocalConnection di uno stesso dominio. In questo modo, si evitano problemi legati alla sicurezza. Tuttavia, se è necessario consentire la comunicazione tra domini diversi, esistono diversi modi per implementare delle misure di sicurezza. Per ulteriori informazioni, vedere la discussione sul parametro connectionName del metodo send() e le sezioni relative ad allowDomain() e domain nella sezione relativa alla classe LocalConnection nella Guida di riferimento al linguaggio e ai componenti di ActionScript 3.0.

SUGGERIMENTO

 

È possibile utilizzare gli oggetti LocalConnection per inviare e ricevere dati in un solo file SWF; Adobe consiglia tuttavia di non utilizzare questo metodo, bensì di utilizzare gli oggetti condivisi.

Sono disponibili tre modi per aggiungere metodi di callback agli oggetti LocalConnection:

Il primo modo per aggiungere i metodi di callback consiste nell'estendere la classe LocalConnection. Definire i metodi all'interno della classe personalizzata anziché aggiungerli in modo dinamico all'istanza di LocalConnection. Questo approccio viene illustrato nel codice riportato di seguito:

package
{
    import flash.net.LocalConnection;
    public class CustomLocalConnection extends LocalConnection
    {
        public function CustomLocalConnection(connectionName:String)
        {
            try
            {
                connect(connectionName);
            }
            catch (error:ArgumentError)
            {
                // Server già creato/connesso
            }
        }
        public function onMethod(timeString:String):void
        {
            trace("onMethod called at: " + timeString);
        }
    }
}

Per creare una nuova istanza della classe DynamicLocalConnection, è possibile utilizzare il codice riportato di seguito:

var serverLC:CustomLocalConnection;
serverLC = new CustomLocalConnection("serverName");

Il secondo modo per aggiungere i metodi di callback consiste nell'utilizzare la proprietà LocalConnection.client. In questa fase occorre creare una classe personalizzata e assegnare una nuova istanza alla proprietà client come illustrato nel codice riportato di seguito:

var lc:LocalConnection = new LocalConnection();
lc.client = new CustomClient();

La proprietà LocalConnection.client indica i metodi di callback dell'oggetto da richiamare. Nel codice precedente la proprietà client è stata impostata su una nuova istanza della classe personalizzata CustomClient. Il valore predefinito per la proprietà client è l'istanza di LocalConnection corrente. È possibile utilizzare la proprietà client se si dispone di due gestori di dati con lo stesso set di metodi ma con un funzionamento diverso; ad esempio, in un'applicazione dove un pulsante in una finestra attiva/disattiva la vista in una seconda finestra.

Per creare la classe CustomClient, è possibile utilizzare il seguente codice:

package
{
    public class CustomClient extends Object
    {
        public function onMethod(timeString:String):void
        {
            trace("onMethod called at: " + timeString);
        }
    }
}

Il terzo modo per aggiungere i metodi di callback, creando una classe dinamica e associando in modo dinamico i metodi, è molto simile all'utilizzo della classe LocalConnection nelle versioni precedenti di ActionScript, come illustrato nel codice riportato di seguito:

import flash.net.LocalConnection;
dynamic class DynamicLocalConnection extends LocalConnection {}

I metodi di callback possono essere aggiunti in modo dinamico a questa classe utilizzando il codice riportato di seguito:

var connection:DynamicLocalConnection = new DynamicLocalConnection();
connection.onMethod = this.onMethod;
// Aggiungere qui il codice.
public function onMethod(timeString:String):void
{
    trace("onMethod called at: " + timeString);
}

Il precedente modo di aggiungere i metodi di callback non è consigliato, perché il codice non è molto portabile. Inoltre, l'utilizzo di questo metodo per la creazione delle connessioni locali potrebbe causare problemi a livello di prestazioni perché l'accesso alle proprietà dinamiche è significativamente più lento dell'accesso alle proprietà chiuse.

Invio di messaggi tra due istanze di Flash Player

Utilizzare la classe LocalConnection per comunicare tra diverse istanze di Flash Player. Ad esempio, in una pagina Web potrebbero essere presenti più istanze di Flash Player oppure potrebbe essere presente un'istanza di Flash Player che recupera i dati da un'istanza di Flash Player in una finestra a comparsa.

Il codice riportato di seguito definisce un oggetto di connessione locale che agisce come un server e accetta le chiamate in arrivo da altre istanze di Flash Player:

package
{
    import flash.net.LocalConnection;
    import flash.display.Sprite;
    public class ServerLC extends Sprite
    {
        public function ServerLC()
        {
            var lc:LocalConnection = new LocalConnection();
            lc.client = new CustomClient1();
            try
            {
                lc.connect("conn1");
            }
            catch (error:Error)
            {
                trace("error:: already connected");
            }
        }
    }
}

Questo codice crea dapprima un oggetto LocalConnection di nome lc e imposta la proprietà client sulla classe personalizzata, CustomClient1. Quando un'altra istanza di Flash Player chiama un metodo in questa istanza della connessione locale, il metodo viene cercato nella classe CustomClient1.

Ogni volta che un'istanza di Flash Player si connette a questo file SWF e tenta di richiamare un metodo qualsiasi per la connessione locale specificata, la richiesta viene inviata alla classe specificata dalla proprietà client, che è impostata sulla classe CustomClient1:

package
{
    import flash.events.*;
    import flash.system.fscommand;
    import flash.utils.Timer;
    public class CustomClient1 extends Object
    {
        public function doMessage(value:String = ""):void
        {
            trace(value);
        }
        public function doQuit():void
        {
            trace("quitting in 5 seconds");
            this.close();
            var quitTimer:Timer = new Timer(5000, 1);
            quitTimer.addEventListener(TimerEvent.TIMER, closeHandler);
        }
        public function closeHandler(event:TimerEvent):void
        {
            fscommand("quit");
        }
    }
}

Per creare un server LocalConnection, chiamare il metodo LocalConnection.connect() e specificare un nome di connessione univoco. Se è già presente una connessione con il nome specificato, viene generato un errore ArgumentError, in cui è indicato che il tentativo di connessione non è riuscito in quanto l'oggetto è già connesso.

Lo snippet di codice seguente illustra come creare una nuova connessione socket con il nome conn1:

try
{
    connection.connect("conn1");
}
catch (error:ArgumentError)
{
    trace("Error! Server already exists\n");
}

NOTA

 

Nelle versioni precedenti di ActionScript, il metodo LocalConnection.connect() restituiva un valore booleano se il nome della connessione era già stato utilizzato. In ActionScript 3.0, se il nome è già stato utilizzato viene generato un errore.

La connessione al file SWF primario da un file SWF secondario richiede la creazione di un nuovo oggetto LocalConnection nell'oggetto LocalConnection mittente e quindi l'esecuzione di una chiamata al metodo LocalConnection.send() con il nome della connessione e il nome del metodo da eseguire. Ad esempio, per connettere l'oggetto LocalConnection creato in precedenza, utilizzare il codice riportato di seguito:

sendingConnection.send("conn1", "doQuit");

Questo codice stabilisce la connessione a un oggetto LocalConnection esistente con il nome di connessione conn1 e richiama il metodo doQuit() nel file SWF remoto. Se si desidera inviare dei parametri al file SWF remoto, specificare gli argomenti aggiuntivi dopo il nome del metodo nel metodo send(), come illustrato nello snippet di codice seguente:

sendingConnection.send("conn1", "doMessage", "Hello world");

Connessione ai documenti SWF in domini diversi

Per consentire le comunicazioni solo da domini specifici, chiamare il metodo allowDomain() o allowInsecureDomain() della classe LocalConnection e passare un elenco di uno o più domini a cui è consentito accedere a questo oggetto LocalConnection.

Nelle versioni precedenti di ActionScript, LocalConnection.allowDomain() e LocalConnection.allowInsecureDomain() erano metodi di callback che dovevano essere implementati dagli sviluppatori e che dovevano restituire un valore booleano. In ActionScript 3.0, LocalConnection.allowDomain() e LocalConnection.allowInsecureDomain() sono metodi incorporati che gli sviluppatori possono chiamare esattamente come Security.allowDomain() e Security.allowInsecureDomain(), passando uno o più nomi di domini a cui consentire l'accesso.

Vi sono due valori speciali che è possibile passare ai metodi LocalConnection.allowDomain() e LocalConnection.allowInsecureDomain(): * e localhost. Il valore asterisco (*) consente l'accesso da tutti i domini. La stringa localhost consente le chiamate al file SWF da tutti i file SWF installati a livello locale.

In Flash Player 8 sono state introdotte delle limitazioni di sicurezza per i file SWF locali. Un file SWF autorizzato ad accedere a Internet non può avere accesso anche al file system locale. Se si specifica localhost, qualunque file SWF locale può accedere al file SWF. Se il metodo LocalConnection.send() tenta di comunicare con un file SWF da una funzione di sicurezza sandbox a cui il codice chiamante non ha accesso, viene inviato un evento securityError (SecurityErrorEvent.SECURITY_ERROR). Per risolvere questo errore, è possibile specificare il dominio del chiamante nel metodo LocalConnection.allowDomain() del ricevente.

Se si implementa la comunicazione solo tra i file SWF dello stesso dominio, è possibile specificare un parametro connectionName che non inizi con un carattere di sottolineatura (_) e che non specifichi un nome di dominio (ad esempio, myDomain:connectionName). Utilizzare la stessa stringa nel comando LocalConnection.connect(connectionName).

Se si implementa la comunicazione tra i file SWF di domini diversi, specificare un parametro connectionName che inizi con un carattere di sottolineatura. L'utilizzo del carattere di sottolineatura rende il file SWF con l'oggetto LocalConnection ricevente più portabile tra i domini. Di seguito sono illustrati i due casi possibili:


Flash CS3

 

Inviami un messaggio e-mail quando vengono aggiunti dei commenti a questa | Rapporto sui commenti

Pagina corrente: http://livedocs.adobe.com/flash/9.0_it/main/00000317.html