Herstellen einer Verbindung mit anderen Flash Player-Instanzen

Mit der LocalConnection-Klasse können Sie für den Datenaustausch zwischen verschiedenen Flash Player-Instanzen sorgen - beispielsweise einer SWF-Datei in einem HTML-Container oder in einem eingebetteten oder eigenständigen Player. So können Sie sehr vielseitige Anwendungen erstellen, die Daten zwischen Flash Player-Instanzen wie z. B. in einem Webbrowser oder in Desktopanwendungen eingebettete SWF-Dateien gemeinsam verwenden können.

Unterthemen

LocalConnection-Klasse
Senden von Nachrichten zwischen zwei Flash Player-Instanzen
Herstellen von Verbindungen mit SWF-Dokumenten in anderen Domänen

LocalConnection-Klasse

Mit der LocalConnection-Klasse können Sie SWF-Dateien entwickeln, die ohne die Methode fscommand() oder JavaScript Anweisungen untereinander austauschen können. LocalConnection-Objekte ermöglichen die Kommunikation zwischen verschiedenen SWF-Dateien auf demselben Client-Computer, die auch in verschiedenen Anwendungen ausgeführt werden können. Beispielsweise können eine in einem Browser ausgeführte SWF-Datei und eine in einem Projektor ausgeführte SWF-Datei Daten gemeinsam nutzen. Dabei verwaltet der Projektor die lokalen Informationen und die browserbasierte SWF-Datei stellt die Remote-Verbindung her. (Ein „Projektor" ist eine SWF-Datei, die in einem Format gespeichert wurde, das als eigenständige Anwendung ausgeführt werden kann - d. h., Flash Player ist in die ausführbare Datei eingebettet und muss nicht installiert sein.)

LocalConnection-Objekte können zur Kommunikation zwischen SWF-Dateien verwendet werden, die mit verschiedenen ActionScript-Versionen erstellt wurden:

Flash Player verarbeitet die Kommunikation zwischen LocalConnection-Objekten verschiedener Versionen automatisch.

Die einfachste Art, ein LocalConnection-Objekt zu verwenden, besteht darin, Datenaustausch nur zwischen LocalConnection-Objekten in derselben Domäne zuzulassen, da Sie sich in diesem Fall nicht um Sicherheitsfragen zu kümmern brauchen. Wenn der Datenaustausch zwischen verschiedenen Domänen erforderlich ist, gibt es eine Reihe von Möglichkeiten, Sicherheitsmaßnahmen zu integrieren. Weitere Informationen finden Sie in den Erläuterungen zum Parameter connectionName der send()-Methode und in den Einträgen zu allowDomain() und domain in der Liste der LocalConnection-Klasse im Komponenten-Referenzhandbuch für ActionScript 3.0.

TIPP

 

Sie können LocalConnection-Objekte zum Senden und Empfangen von Daten innerhalb einer SWF-Datei verwenden. Dies wird jedoch nicht empfohlen. Verwenden Sie stattdessen gemeinsame Objekte.

Es gibt drei Verfahren, Ihre LocalConnection-Objekte in Rückrufmethoden einzufügen:

Das erste Verfahren, Rückrufmethoden hinzuzufügen, ist das Erweitern der LocalConnection-Klasse. Sie definieren die Methoden mit der benutzerdefinierten Klasse, anstatt sie der LocalConnection-Instanz dynamisch hinzuzufügen. Dieser Ansatz wird im folgenden Code gezeigt:

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

Um eine neue Instanz der DynamicLocalConnection-Klasse zu erstellen, können Sie den folgenden Code verwenden:

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

Die zweite Möglichkeit, Rückrufmethoden hinzuzufügen, ist das Verwenden der Eigenschaft LocalConnection.client. Hierzu gehört das Erstellen einer benutzerdefinierten Klasse und das Zuweisen einer neuen Instanz zur client-Eigenschaft. Dies wird im folgenden Code gezeigt:

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

Die Eigenschaft LocalConnection.client gibt die Objekt-Rückrufmethoden an, die aufgerufen werden müssen. Im vorangegangenen Code wurde die Eigenschaft client auf eine neue Instanz einer benutzerdefinierten Klasse eingestellt: CustomClient. Der Standardwert der Eigenschaft client ist die aktuelle LocalConnection-Instanz. Sie können die Eigenschaft client verwenden, wenn zwei Datenprozeduren den gleichen Methodensatz aufweisen, jedoch unterschiedlich agieren - beispielsweise in einer Anwendung, in der eine Schaltfläche in einem Fenster die Ansicht in einem zweiten Fenster umschaltet.

Zum Erstellen der CustomClient-Klasse können Sie den folgenden Code verwenden:

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

Die dritte Möglichkeit zum Hinzufügen von Rückrufmethoden, das Erstellen einer dynamischen Klasse und das dynamische Anhängen der Methoden, ähnelt dem Verwenden der LocalConnection-Klasse in früheren Versionen von ActionScript. Dies wird im folgenden Code gezeigt:

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

Rückrufmethoden können dieser Klasse mithilfe des folgenden Codes dynamisch hinzugefügt werden:

var connection:DynamicLocalConnection = new DynamicLocalConnection();
connection.onMethod = this.onMethod;
// Hier eigenen Code eingeben.
public function onMethod(timeString:String):void
{
    trace("onMethod called at: " + timeString);
}

Das zuvor beschriebene Verfahren zum Hinzufügen von Rückrufmethoden wird nicht empfohlen, da es dem Code an Portabilität mangelt. Darüber hinaus führt dieses Verfahren zum Erstellen lokaler Verbindungen möglicherweise zu Leistungsbeeinträchtigungen, da der Zugriff auf dynamische Eigenschaften deutlich langsamer erfolgt als der Zugriff auf versiegelte Eigenschaften.

Senden von Nachrichten zwischen zwei Flash Player-Instanzen

Mit der LocalConnection-Klasse können zwei unterschiedliche Instanzen von Flash Player miteinander kommunizieren. Beispielsweise können Sie mehrere Flash Player-Instanzen auf einer Webseite integrieren, oder eine Flash Player-Instanz Daten von einer zweiten Flash Player-Instanz in einem Popup-Fenster abrufen lassen.

Der folgende Code definiert ein lokales Verbindungsobjekt, das als Server fungiert und eingehende Anrufe von anderen Flash Player-Instanzen akzeptiert:

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

Dieser Code erstellt zunächst ein LocalConnection-Objekt namens lc und stellt dann die Eigenschaft client auf eine benutzerdefinierte Klasse, CustomClient1, ein. Wenn eine weitere Flash Player-Instanz eine Methode in dieser lokalen Verbindungsinstanz aufruft, sucht Flash Player in der CustomClient1-Klasse nach dieser Methode.

Immer wenn eine Flash Player-Instanz eine Verbindung mit dieser SWF-Datei herstellt und versucht, eine Methode für die angegebene lokale Verbindung aufzurufen, wird die Anforderung an die von der client-Eigenschaft angegebene Klasse gesendet. Diese Eigenschaft ist auf die CustomClient1-Klasse eingestellt:

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

Zum Erstellen eines LocalConnection-Servers rufen Sie die LocalConnection.connect()-Methode auf und geben einen einmaligen Verbindungsnamen ein. Wenn bereits eine Verbindung mit dem angegebenen Namen besteht, wird ein ArgumentError-Fehler erzeugt, der darauf hinweist, dass die versuchte Verbindung fehlgeschlagen ist, da das Objekt bereits eine Verbindung hergestellt hat.

Der folgende Codeausschnitt zeigt, wie eine neue Socketverbindung mit dem Namen conn1 hergestellt wird:

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

HINWEIS

 

In früheren Versionen von ActionScript gab die LocalConnection.connect()-Methode einen booleschen Wert zurück, wenn der Verbindungsname bereits verwendet wurde. In ActionScript 3.0 wird in diesem Fall ein Fehler ausgelöst.

Zum Herstellen einer Verbindung mit der primären SWF-Datei erfordert die sekundäre SWF-Datei, dass Sie ein neues LocalConnection-Objekt im sendenden LocalConnection-Objekt erstellen und dann die LocalConnection.send()-Methode mit dem Namen der Verbindung und dem Namen der auszuführenden Methode aufrufen. Um beispielsweise eine Verbindung mit dem zuvor erstellten LocalConnection-Objekt herzustellen, verwenden Sie den folgenden Code:

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

Dieser Code stellt eine Verbindung zu einem bestehenden LocalConnection-Objekt mit dem Verbindungsnamen conn1 her und ruft die doQuit()-Methode der externen SWF-Datei auf. Wenn Sie Parameter an die externe SWF-Datei senden möchten, geben Sie zusätzliche Argumente hinter dem Methodennamen in der send()-Methode an. Dies wird im folgenden Codeausschnitt gezeigt:

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

Herstellen von Verbindungen mit SWF-Dokumenten in anderen Domänen

Um einen Datenaustausch zwischen bestimmten Domänen zu ermöglichen, rufen Sie die allowDomain()- oder allowInsecureDomain()-Methode der LocalConnection-Klasse auf und übergeben eine Liste mit mindestens einer Domäne, die auf dieses LocalConnection-Objekt zugreifen kann.

In früheren Versionen von ActionScript waren LocalConnection.allowDomain() und LocalConnection.allowInsecureDomain() Rückrufmethoden, die von den Entwicklern implementiert werden mussten und einen booleschen Wert zurückgaben. In ActionScript 3.0 sind LocalConnection.allowDomain() und LocalConnection.allowInsecureDomain() integrierte Methoden, die Entwickler genauso wie Security.allowDomain() und Security.allowInsecureDomain() aufrufen können, um mindestens einen Domänennamen zu übergeben, für den der Zugriff erlaubt ist.

Es gibt zwei spezielle Werte, die Sie an die Methoden LocalConnection.allowDomain() und LocalConnection.allowInsecureDomain() übergeben können: * und localhost. Der Sternchen-Wert (*) gestattet den Zugriff von allen Domänen. Der String localhost gestattet Aufrufe der SWF-Datei von lokal installierten SWF-Dateien.

Mit Flash Player 8 wurden Sicherheitsbeschränkungen für lokale SWF-Dateien eingeführt. SWF-Dateien, die auf das Internet zugreifen können, haben keinen Zugriff auf das lokale Dateisystem. Wenn Sie localhost angeben, können alle lokalen SWF-Dateien auf diese SWF-Datei zugreifen. Wenn die LocalConnection.send()-Methode versucht, mit einer SWF-Datei in einer Sicherheits-Sandbox zu kommunizieren, auf die der aufrufende Code keinen Zugriff hat, wird ein securityError-Ereignis (SecurityErrorEvent.SECURITY_ERROR) ausgelöst. Um diesen Fehler zu umgehen, können Sie die Domäne des aufrufenden Elements in der LocalConnection.allowDomain()-Methode des Empfängers angeben.

Wenn Sie den Datenaustausch nur zwischen SWF-Dateien in derselben Domäne implementieren, geben Sie einen Parameter connectionName an, der nicht mit einem Unterstrich (_) beginnt und keinen Domänennamen angibt (beispielsweise myDomain:connectionName). Verwenden Sie denselben String im Befehl LocalConnection.connect(connectionName).

Wenn Sie den Datenaustausch zwischen SWF-Dateien in verschiedenen Domänen implementieren, geben Sie einen connectionName-Parameter an, der mit einem Unterstrich beginnt. Durch die Angabe eines Unterstrichs wird die Portierbarkeit der SWF-Datei mit dem empfangenden LocalConnection-Objekt zwischen Domänen erhöht. Im Folgenden finden Sie zwei mögliche Szenarios:


Flash CS3

 

Eine E-Mail an mich senden, wenn dieser Seite Kommentare hinzugefügt werden | Kommentarbericht

Aktuelle Seite: http://livedocs.adobe.com/flash/9.0_de/main/00000317.html