Communiceren met andere instanties van Flash Player en AIR

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

De klasse LocalConnection maakt communicatie mogelijk tussen Adobe® AIR®-toepassingen en tussen SWF-inhoud die in de browser wordt uitgevoerd. U kunt de klasse LocalConnection ook gebruiken om te communiceren tussen een AIR-toepassing en SWF-inhoud in de browser. Met de klasse LocalConnection kunt u zeer veelzijdige toepassingen maken die gegevens kunnen delen tussen instanties van Flash Player en AIR.

Informatie over de klasse LocalConnection

De klasse LocalConnection biedt u de mogelijkheid SWF-bestanden te ontwikkelen die instructies kunnen verzenden naar andere SWF-bestanden zonder gebruik te maken van de methode fscommand() of JavaScript. Een object LocalConnection kan alleen communiceren via SWF-bestanden die op dezelfde clientcomputer worden uitgevoerd, maar een object LocalConnection kan door verschillende toepassingen worden uitgevoerd. Zo kunnen een SWF-bestand dat wordt uitgevoerd in een browser en een SWF-bestand dat wordt uitgevoerd in een projector informatie delen, waarbij de projector lokale informatie bijhoudt en het SWF-bestand in de browser extern verbinding maakt. (Een projector is een SWF-bestand dat is opgeslagen in een indeling die als een zelfstandige toepassing kan worden uitgevoerd. Met andere woorden, de projector vereist niet dat Flash Player is geïnstalleerd omdat dit programma is ingesloten in het uitvoerbare bestand.)

Een object LocalConnection kan worden gebruikt om te communiceren tussen SWF-bestanden die verschillende versies van ActionScript gebruiken:

  • Een object LocalConnection uit ActionScript 3.0 kan communiceren met objecten LocalConnection die in ActionScript 1.0 of 2.0 zijn gemaakt.

  • Een object LocalConnection uit ActionScript 1.0 of 2.0 kan communiceren met objecten LocalConnection die in ActionScript 3.0 zijn gemaakt.

Flash Player handelt deze communicatie tussen objecten LocalConnection van verschillende versies automatisch af.

De eenvoudigste manier om een LocalConnection-object te gebruiken, is om alleen communicatie tussen LocalConnection-objecten in hetzelfde domein of dezelfde AIR-toepassing toe te staan. Zo hoeft u zich geen zorgen te maken over de beveiliging. Wanneer het echter noodzakelijk is communicatie tussen domeinen toe te staan, kunt u op verschillende manieren beveiligingsmaatregelen implementeren. Zie de discussie over de parameter connectionName van de methode send() en de vermeldingen allowDomain() en domain in de vermelding van de klasse LocalConnection in de Naslaggids voor ActionScript 3.0 voor het Adobe Flash-platform voor meer informatie.

U kunt objecten LocalConnection gebruiken voor het verzenden en ontvangen van gegevens binnen één SWF-bestand, maar Adobe beveelt dit niet aan. Gebruik in plaats hiervan gezamenlijke objecten.

U kunt op drie manieren callback-methoden toevoegen aan uw objecten LocalConnection:

  • Maak een subklasse van de klasse LocalConnection en voeg methoden toe.

  • Stel de eigenschap LocalConnection.client in op een object dat de methoden implementeert.

  • Maak een dynamische klasse die LocalConnection uitbreidt en verbind de methoden dynamisch.

U kunt ten eerste callback-methoden toevoegen door de klasse LocalConnection uit te breiden. U definieert de methoden binnen de aangepaste klasse in plaats van ze dynamisch toe te voegen aan de instantie van LocalConnection. Dit wordt geïllustreerd in de volgende code:

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

Om een nieuwe instantie van de klasse CustomLocalConnection te maken, kunt u de volgende code gebruiken:

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

U kunt ten tweede ook callback-methoden toevoegen met de eigenschap LocalConnection.client . Hierbij maakt u een aangepaste klasse en wijst u een nieuwe instantie toe aan de eigenschap client , zoals in de volgende code wordt getoond:

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

De eigenschap LocalConnection.client geeft de callback-methoden aan die moeten worden aangeroepen. In de voorgaande code werd de eigenschap client ingesteld op een nieuwe instantie van een aangepaste klasse, CustomClient. De standaardwaarde voor de eigenschap client is de huidige instantie van LocalConnection. U kunt de eigenschap client gebruiken als u twee gegevenshandlers gebruikt die dezelfde reeks methoden hebben, maar anders werken, bijvoorbeeld in een toepassing waar een knop in het ene venster de weergave in een tweede venster wijzigt.

U kunt de klasse CustomClient maken door de volgende code te gebruiken:

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

De derde manier om callback-methoden toe te voegen, een dynamische klasse maken en de methoden dynamisch koppelen, lijkt op het gebruik van de klasse LocalConnection in eerdere versies van ActionScript, zoals u ziet in de volgende code:

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

Callback-methoden kunnen dynamisch aan deze klasse worden toegevoegd met de volgende code:

var connection:DynamicLocalConnection = new DynamicLocalConnection(); 
connection.onMethod = this.onMethod; 
// Add your code here. 
public function onMethod(timeString:String):void 
{ 
    trace("onMethod called at: " + timeString); 
}

De voorgaande methode om callback-methoden toe te voegen wordt niet aanbevolen omdat de code niet erg overdraagbaar is. Als u deze methode om lokale verbindingen te maken gebruikt, zou dit bovendien kunnen leiden tot prestatievermindering omdat de toegang tot dynamische eigenschappen veel trager is dan de toegang tot verzegelde eigenschappen.

isPerUser-eigenschap

De isPerUser -eigenschap is aan Flash Player (10.0.32) en AIR (1.5.2) toegevoegd om een conflict op te lossen dat optreedt wanneer meerdere gebruikers zijn aangemeld bij een Mac-computer. Op andere besturingssystemen wordt deze eigenschap genegeerd, aangezien de lokale verbinding altijd al bestemd was voor individuele gebruikers. In nieuwe code dient de isPerUser -eigenschap te worden ingesteld op true . De standaardwaarde is momenteel echter false ten behoeve van compatibiliteit met oudere versies. Het is mogelijk dat deze standaardinstelling in nieuwe versies van de runtimes wordt veranderd.

Berichten versturen tussen twee toepassingen

Met de LocalConnection-klasse kunt u communiceren tussen verschillende AIR-toepassingen en tussen verschillende Adobe® Flash® Player (SWF)-toepassingen die in een browser actief zijn. U kunt de klasse LocalConnection ook gebruiken om te communiceren tussen een AIR-toepassing en SWF-toepassing in een browser.

U zou bijvoorbeeld meerdere instanties van Flash Player aan een webpagina kunnen toevoegen of een Flash Player-instantie gegevens laten ophalen uit een Flash Player-instantie in een pop-upvenster.

De volgende code definieert een LocalConnection-object dat als server fungeert en binnenkomende LocalConnection-oproepen van andere toepassingen accepteert:
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"); 
            } 
        } 
    } 
}

Deze code maakt eerst een LocalConnection-object met de naam lc en stelt de eigenschap client in op een clientObject -object. Als een andere toepassing een methode in deze LocalConnection-instantie aanroept, zoekt de runtime naar die methode in het clientObject -object.

Als er al een verbinding met de opgegeven naam bestaat, wordt de uitzondering ArgumentError gegenereerd om aan te geven dat de verbindingspoging is mislukt omdat het object al is verbonden.

Wanneer een instantie van Flash Player verbinding maakt met dit SWF-bestand en probeert een methode aan te roepen voor de opgegeven lokale verbinding, wordt de aanvraag verzonden naar de klasse die is opgegeven in de eigenschap client , die is ingesteld op de klasse 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"); 
        } 
    } 
}

Als u een LocalConnection-server wilt maken, roept u de methode LocalConnection.connect() aan en geeft u een unieke naam voor de verbinding op. Als er al een verbinding is met de opgegeven naam, wordt de fout ArgumentError gegenereerd om aan te geven dat de verbindingspoging is mislukt omdat het object al is verbonden.

In het volgende fragment ziet u hoe u een nieuwe LocalConnection maakt met de naam conn1 :
try 
{ 
    connection.connect("conn1"); 
} 
catch (error:ArgumentError) 
{ 
    trace("Error! Server already exists\n"); 
}
Als u verbinding wilt maken met de primaire toepassing vanuit een secundaire toepassing, moet u eerst een LocalConnection-object maken in het verzendende LocalConnection-object. Roep vervolgens de methode LocalConnection.send() aan met de naam van de verbinding en de naam van de methode die moeten worden uitgevoerd. Stuur bijvoorbeeld de doQuit -methode naar het LocalConnection-object dat u eerder hebt gemaakt, met behulp van de volgende code:
sendingConnection.send("conn1", "doQuit");

Deze code maakt verbinding met een bestaand LocalConnection-object met de verbindingsnaam conn1 en roept de methode doMessage() in de externe toepassing op. Als u parameters naar de externe toepassing wilt verzenden, geeft u aanvullende argumenten op na de methodenaam in de methode send() , zoals in het volgende fragment:

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

Verbinding maken met inhoud in verschillende domeinen en met AIR-toepassingen

Als u alleen communicatie vanuit specifieke domeinen wenst toe te staan, roept u de methode allowDomain() of allowInsecureDomain() van de klasse LocalConnection op en geeft u een lijst met een of meer domeinen door die toegang mogen hebben tot dit LocalConnection-object.

In eerdere versies van ActionScript waren LocalConnection.allowDomain() en LocalConnection.allowInsecureDomain() callback-methoden die door ontwikkelaars moesten worden geïmplementeerd en een Booleaanse waarde moesten retourneren. In ActionScript 3.0 zijn LocalConnection.allowDomain() en LocalConnection.allowInsecureDomain() beide ingebouwde methoden die ontwikkelaars kunnen aanroepen op dezelfde manier als Security.allowDomain() en Security.allowInsecureDomain() , waarbij ze een of meer namen van toegestane domeinen doorgeven.

In Flash Player 8 zijn voor het eerst beveiligingsbeperkingen voor lokale SWF-bestanden opgenomen. Een SWF-bestand dat toegang heeft tot internet, kan niet ook toegang tot het lokale bestandssysteem hebben. Wanneer u localhost opgeeft, heeft elk lokaal SWF-bestand toegang tot dit SWF-bestand. Als de methode LocalConnection.send() probeert te communiceren met een SWF-bestand uit een beveiligingssandbox waartoe de aanroepende code geen toegang heeft, wordt de gebeurtenis securityError ( SecurityErrorEvent.SECURITY_ERROR ) verzonden. U kunt deze fout omzeilen door het domein van de oproeper op te geven in de methode LocalConnection.allowDomain() van de ontvanger.

Er zijn twee speciale waarden die u kunt doorgeven aan de methoden LocalConnection.allowDomain() en LocalConnection.allowInsecureDomain() : * en localhost . Het sterretje (*) staat toegang toe vanuit alle domeinen. Met de tekenreeks localhost zijn oproepen van de toepassing mogelijk vanuit inhoud die lokaal is geïnstalleerd maar zich buiten de resourcemap van de toepassing bevindt.

Als de methode LocalConnection.send() probeert te communiceren met een toepassing vanuit een beveiligingssandbox waartoe de oproepende code geen toegang heeft, wordt de gebeurtenis securityError ( SecurityErrorEvent.SECURITY_ERROR ) verzonden. U kunt deze fout omzeilen door het domein van de oproeper op te geven in de methode LocalConnection.allowDomain() van de ontvanger.

Als u alleen communicatie tussen inhoud in hetzelfde domein implementeert, kunt u de parameter connectionName opgeven die niet met een onderstrepingsteken ( _ ) begint en die geen domeinnaam opgeeft (bijvoorbeeld myDomain:connectionName ). Gebruik dezelfde tekenreeks in de opdracht LocalConnection.connect(connectionName) .

Als u communicatie tussen inhoud in verschillende domeinen implementeert, geeft u voor de parameter connectionName een waarde op die begint met een onderstrepingsteken. Als u het onderstrepingsteken gebruikt, kunt u de inhoud met het ontvangende LocalConnection-object gemakkelijker overdragen tussen domeinen. Hier volgen twee mogelijke scenario's:

  • Wanneer de tekenreeks voor connectionName niet met een onderstrepingsteken begint, voegt de runtime aan de superdomeinnaam een voorvoegsel plus dubbele punt toe (bijvoorbeeld myDomain:connectionName ). Hoewel dit ervoor zorgt dat er geen conflicten optreden tussen de verbinding en andere verbindingen met dezelfde naam in een ander domein, moet elk verzendend LocalConnection-object dit superdomein opgeven (bijvoorbeeld myDomain:connectionName ). Als u het HTML- of SWF-bestand met het ontvangende LocalConnection-object naar een ander domein verplaatst, wijzigt de runtime het voorvoegsel, zodat dit het nieuwe superdomein weerspiegelt (bijvoorbeeld anotherDomain:connectionName ). Alle verzendende LocalConnection-objecten moeten handmatig worden bewerkt, zodat ze naar het nieuwe superdomein wijzen.

  • Wanneer de tekenreeks voor connectionName met een onderstrepingsteken begint (bijvoorbeeld _connectionName" ), voegt de runtime geen voorvoegsel toe aan de tekenreeks. Dit houdt in dat de ontvangende en verzendende LocalConnection-objecten identieke tekenreeksen gebruiken voor connectionName . Als het ontvangende object door middel van LocalConnection.allowDomain() opgeeft dat verbindingen van elk domein worden geaccepteerd, kunt u het HTML- of SWF-bestand met het ontvangende LocalConnection-object naar een ander domein verplaatsen zonder dat u verzendende LocalConnection-objecten hoeft te wijzigen.

    Een nadeel van namen met onderstrepingsteken in connectionName is de kans op botsingen, bijvoorbeeld als twee toepassingen verbinding proberen te maken met dezelfde connectionName . Een tweede, gerelateerd nadeel betreft de beveiliging. Verbindingsnamen die gebruikmaken van een onderstrepingsteken identificeren niet het domein van de luisterende toepassing. Daarom genieten domeinspecifieke namen de voorkeur.

Adobe AIR

Om te kunnen communiceren met inhoud die in de beveiligingssandbox van de AIR-toepassing wordt uitgevoerd (inhoud die samen met de AIR-toepassing is geïnstalleerd), dient u een voorvoegsel aan de verbindingsnaam toe te voegen waarin het superdomein dat de AIR-toepassing identificeert tot uitdrukking komt. De superdomeinreeks begint met app# , gevolgd door achtereenvolgens de toepassings-id, een punt (.) en de uitgevers-id (als deze gedefinieerd is). Zo is het juiste superdomein voor gebruik in de connectionName -parameter voor een toepassing met de toepassings-id com.example.air.MyApp , maar zonder uitgevers-id: "app#com.example.air.MyApp" . Als de basisnaam van de verbinding ''appConnection'' is, dient u de volgende volledige reeks te gebruiken in de connectionName -parameter: "app#com.example.air.MyApp:appConnection" . Als de toepassing de uitgevers-id heeft, moet die id ook worden opgenomen in de superdomeinreeks: "app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4.1" .

Als u toestaat dat een andere AIR-toepassing via de lokale verbinding met uw toepassing communiceert, dient u de waarde allowDomain() van het LocalConnection-object aan te roepen en de domeinnaam van de lokale verbinding door te geven. Voor een AIR-toepassing wordt deze domeinnaam gevormd op basis van de toepassings- en uitgevers-id, net zoals bij de verbindingstekenreeks. Voorbeeld: als de verzendende AIR-toepassing de toepassings-id com.example.air.FriendlyApp en de uitgevers-id 214649436BD677B62C33D02233043EA236D13934.1 , heeft, gebruikt u de volgende domeintekenreeks om deze toepassing toestemming te geven om te verbinden: app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934.1 . (Met ingang van AIR 1.5.3 beschikken niet alle AIR-toepassingen over gebruikers-id's.)