Kommunicera med andra Flash Player- och AIR-instanser

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Klassen LocalConnection används för kommunikation mellan Adobe® AIR®-program och mellan SWF-innehåll som körs i webbläsaren. Du kan också använda klassen LocalConnection för kommunikation mellan ett AIR-program och SWF-innehåll som körs i webbläsaren. Med hjälp av klassen LocalConnection kan du skapa mångsidiga program som kan dela data mellan olika instanser av Flash Player och AIR.

Om klassen LocalConnection

Med klassen LocalConnection kan du utveckla SWF-filer som skickar instruktioner till andra SWF-filer utan att använda metoden fscommand() eller JavaScript. LocalConnection-objekt kan bara kommunicera med andra SWF-filer som körs på samma klientdator, men de kan köras i olika program. En SWF-fil som körs i en webbläsare och en SWF-fil som körs i en projektor kan till exempel dela information. Projektorn har då den lokala informationen och den webbläsarbaserade SWF-filen ansluter via en fjärranslutning. (En projektor är en SWF-fil som har sparats i ett format som kan köras som ett fristående program, d.v.s.: Flash Player behöver inte vara installerat eftersom projektorn är inbäddad i den körbara filen.)

LocalConnection-objekt kan användas för kommunikation mellan SWF-filer med hjälp av olika ActionScript-versioner:

  • LocalConnection-objekt som har skapats i ActionScript 3.0 kan kommunicera med LocalConnection-objekt som har skapats i ActionScript 1.0 eller 2.0.

  • LocalConnection-objekt som har skapats i ActionScript 1.0 eller 2.0 kan kommunicera med LocalConnection-objekt som har skapats i ActionScript 3.0.

I Flash Player sker kommunikationen mellan LocalConnection-objekt som har olika versioner automatiskt.

Det enklaste sättet att använda ett LocalConnection-objekt på är att bara tillåta kommunikation mellan LocalConnection-objekt som finns i samma domän eller i samma AIR-program. På det sättet behöver du inte oroa dig för eventuella säkerhetsproblem. Om du måste tillåta kommunikation mellan olika domäner kan du dock vidta flera olika säkerhetsåtgärder. Mer information finns i avsnittet om parametern connectionName för metoden send() och i avsnitten om allowDomain() och domain för klassen LocalConnection i Referenshandbok för ActionScript 3.0 i Adobe Flash-plattformen .

Det går att använda LocalConnection-objekt för att skicka och ta emot data i en enda SWF-fil, men det är inget vi rekommenderar. Använd i stället delade objekt.

Du kan lägga till återkallningsmetoder till LocalConnection-objekt på något av följande tre sätt:

  • Använda underklasser till klassen LocalConnection och lägga till metoder

  • Ställa in egenskapen LocalConnection.client på ett objekt som implementerar metoderna

  • Skapa en dynamisk klass som utökar LocalConnection och bifogar metoder dynamiskt

Det första sättet att lägga till återkallningsmetoder på är att utöka klassen LocalConnection. Du definierar metoderna i den anpassade klassen i stället för att lägga till dem dynamiskt till LocalConnection-instansen. Följande kod visar detta:

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

För att kunna skapa en ny instans av klassen CustomLocalConnection kan du använda följande kod:

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

Det andra sättet att lägga till återkallningsmetoder på är att använda egenskapen LocalConnection.client . Då skapar du en anpassad klass och tilldelar en ny instans till egenskapen client som i följande kod:

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

Egenskapen LocalConnection.client anger vilka objektåterkallningsmetoder som ska anropas. I ovanstående kod ställdes egenskapen client in på en ny instans av en anpassad klass, CustomClient. Standardvärdet för egenskapen client är den aktuella LocalConnection-instansen. Du kan använda egenskapen client om du har två datahanterare som har samma uppsättning metoder, men fungerar på olika sätt. Det kan till exempel gälla ett program där en knapp i ett fönster växlar visningen i ett andra fönster.

Om du vill skapa klassen CustomClient använder du följande kod:

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

Det tredje sättet att lägga till återkallningsmetoder på innebär att skapa en dynamisk klass och att sedan bifoga metoderna dynamiskt. Det påminner om sättet som klassen LocalConnection användes på i tidigare versioner av ActionScript, vilket följande kod visar:

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

Återkallningsmetoder kan läggas till dynamiskt till den här klassen med hjälp av följande kod:

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

Det föregående sättet att lägga till återkallningsmetoder på rekommenderas inte, eftersom koden inte är särskild portabel. Dessutom skulle det här sättet att skapa lokala anslutningar på skapa prestandaproblem, eftersom det tar avsevärt mycket längre tid att få tillgång till dynamiska egenskaper jämfört med fasta (icke-dynamiska) egenskaper.

Egenskapen isPerUser

Egenskapen isPerUser lades till i Flash Player (10.0.32) och AIR (1.5.2) för att lösa en konflikt som inträffar när fler än en användare är inloggad på en Mac-dator. I andra operativsystem ignoreras egenskapen eftersom den lokala anslutningen alltid har omfattat endast enskilda användare. Egenskapen isPerUser ska vara inställd på true i ny kod. Det aktuella standardvärdet är emellertid false för bakåtkompabilitet. Standardvärdet kan ändras i framtida versioner av körningstider.

Skicka meddelanden mellan två program

Du använder klassen LocalConnection för kommunikation mellan olika AIR-program och mellan olika Adobe® Flash® Player-program (SWF) som körs i en webbläsare. Du kan också använda klassen LocalConnection för kommunikation mellan ett AIR-program och ett SWF-program som körs i en webbläsare.

Du kan till exempel ha flera Flash Player-instanser på en webbsida, eller låta en Flash Player-instans hämta data från en Flash Player-instans i ett popup-fönster.

Följande kod definierar ett LocalConnection-objekt som fungerar som en server och som accepterar inkommande LocalConnection-anrop från andra program:
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"); 
            } 
        } 
    } 
}

Koden skapar först ett LocalConnection-objekt som heter lc och ställer in egenskapen client till ett objekt, clientObject . När ett annat program anropar en metod i den här LocalConnection-instansen, söker körningen efter metoden i clientObject -objektet.

Om du redan har en anslutning med det angivna namnet, utlöses ett argumentfelsundantag som anger att anslutningen misslyckades eftersom objektet redan är anslutet.

Varje gång en Flash Player-instans ansluter till den här SWF-filen och försöker att anropa en metod för den angivna lokala anslutningen, skickas begäran till klassen som har angetts med egenskapen client , som är inställd på klassen 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"); 
        } 
    } 
}

För att skapa en LocalConnection-server anropar du metoden LocalConnection.connect() och anger sedan ett unikt anslutningsnamn. Om du redan har en anslutning med det angivna namnet, genereras ett ArgumentError-fel som anger att anslutningen misslyckades eftersom objektet redan är anslutet.

Följande utdrag visar hur du skapar en LocalConnection med namnet conn1 :
try 
{ 
    connection.connect("conn1"); 
} 
catch (error:ArgumentError) 
{ 
    trace("Error! Server already exists\n"); 
}
För att ansluta till det primära programmet från ett sekundärt program måste du först skapa ett LocalConnection-objekt i det sändande LocalConnection-objektet, och sedan anropa metoden LocalConnection.send() med namnet på anslutningen och namnet på metoden som ska köras. Om du till exempel vill skicka metoden doQuit till det LocalConnection-objekt du skapade tidigare använder du följande kod:
sendingConnection.send("conn1", "doQuit");

Den här koden ansluter till ett befintligt LocalConnection-objekt med anslutningsnamnet conn1 och anropar metoden doMessage() i fjärrprogrammet. Om du vill skicka parametrar till fjärrprogrammet anger du ytterligare argument efter metodnamnet i metoden send() som i följande utdrag:

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

Ansluta till innehåll i andra domäner och till AIR-program

För att tillåta kommunikation enbart från specifika domäner anropar du metoden allowDomain() eller allowInsecureDomain() i klassen LocalConnection och anger en lista med en eller flera domäner som ska kunna få tillgång till det här LocalConnection-objektet, och anger på så sätt ett eller flera namn på domäner som ska tillåtas.

I tidigare versioner av ActionScript var LocalConnection.allowDomain() och LocalConnection.allowInsecureDomain() återkallningsmetoder som utvecklare var tvungna att implementera och dessa var tvungna att returnera ett booleskt värde. I ActionScript 3.0 är LocalConnection.allowDomain() och LocalConnection.allowInsecureDomain() båda inbyggda metoder som utvecklare kan anropa precis som Security.allowDomain() och Security.allowInsecureDomain() för att ange ett eller flera namn på domäner som är tillåtna.

I Flash Player 8 används säkerhetsinställningar för lokala SWF-filer. Som standard kan inte en SWF-fil ha åtkomst till både Internet och det lokala filsystemet. Om du anger localhost kan valfri lokal SWF-fil få åtkomst till SWF-filen. Om metoden LocalConnection.send() försöker att kommunicera med en SWF-fil från en säkerhetssandlåda som den anropande koden inte har tillgång till, skickas en securityError -händelse( SecurityErrorEvent.SECURITY_ERROR ). För att undvika det här felet kan du ange anroparens domän i mottagarens LocalConnection.allowDomain() -metod.

Det finns två specialvärden som du kan skicka till metoderna LocalConnection.allowDomain() och LocalConnection.allowInsecureDomain() : * och localhost . Asteriskvärdet (*) tillåter åtkomst från alla domäner. Strängen localhost tillåter anrop till programmet från lokalt installerat innehåll som ligger utanför programresurskatalogen.

Om metoden LocalConnection.send() försöker att kommunicera med ett program från en säkerhetssandlåda som den anropande koden inte har tillgång till, skickas en securityError -händelse( SecurityErrorEvent.SECURITY_ERROR ). För att undvika det här felet kan du ange anroparens domän i mottagarens LocalConnection.allowDomain() -metod.

Om du implementerar kommunikation enbart mellan innehåll i samma domän, kan du ange en connectionName -parameter som inte börjar med understreck ( _ ) och som inte anger något domännamn (till exempel myDomain:connectionName ). Använd samma sträng i kommandot LocalConnection.connect(connectionName) .

Om du implementerar kommunikation mellan innehåll i olika domäner, anger du en connectionName -parameter som börjar med understreck. Genom att ange understrecket blir innehållet med det mottagande LocalConnection-objektet mer portabelt mellan domäner. Det här är de två möjliga fallen:

  • Om strängen för connectionName inte börjar med ett understreck lägger körtiden till ett prefix med huvuddomännamnet och ett kolon (till exempel myDomain:connectionName ). Detta förhindrar att konflikter uppstår mellan anslutningen och andra anslutningar med samma namn från andra domäner, men alla sändande LocalConnection-objekt måste ange den här huvuddomänen (till exempel myDomain:connectionName ). Om du flyttar HTML- eller SWF-filen med det mottagande LocalConnection-objektet till en annan domän, ändrar körtiden prefixet så att det motsvarar den nya huvuddomänen (till exempel anotherDomain:connectionName ). Alla sändande LocalConnection-objekt måste redigeras manuellt så att de pekar på den nya huvuddomänen.

  • Om strängen för connectionName börjar med ett understreck (till exempel _connectionName ) lägger körtiden inte till något prefix till strängen. Det innebär att de mottagande och sändande LocalConnection-objekten använder identiska strängar för connectionName . Om det mottagande objektet använder LocalConnection.allowDomain() för att ange att anslutningar från alla domäner godtas, kan du flytta HTML- eller SWF-filen med det mottagande LocalConnection-objektet till en annan domän utan att ändra några sändande LocalConnection-objekt.

    En nackdel med att använda namn med understreck i connectionName är risken för kollisioner, som när två program försöker att ansluta genom att använda samma connectionName . En andra, relaterad, nackdel är säkerhetsrelaterad. Anslutningsnamn som använder understreck-syntax identifierar inte det lyssnande programmets domän. Av dessa anledningar är domänkvalificerade namn att föredra.

Adobe AIR

För att kunna kommunicera med innehåll som körs i säkerhetssandlådan för AIR-programmet (innehåll som installerats med AIR-programmet) måste du ge anslutningsnamnet ett prefix med en superdomän som identifierar AIR-programmet. Superdomänsträngen börjar med app# följt av program-ID, följt av ett punkttecken (.), följt av utgivar-ID (om det är angivet). Exempelvis är den riktiga superdomänen som ska användas i connectionName -parametern för ett program med program-ID com.example.air.MyApp , och inget utgivar-ID: "app#com.example.air.MyApp" . Om basanslutningsnamnet är "appConnection" är alltså den fullständiga sträng som ska användas i connectionName -parametern "app#com.example.air.MyApp:appConnection" . Om programmet har utgivar-ID måste även detta ID ingå i superdomänsträngen: "app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4.1" .

När du tillåter att ett annat AIR-program kommunicerar med ditt program genom den lokala anslutningen, måste du anropa allowDomain() för LocalConnection-objektet, och skicka med domännamnet för den lokala anslutningen. I ett AIR-program utformas domännamnet utifrån program- och utgivar-ID på samma sätt som anslutningssträngen. Om det sändande AIR-programmet till exempel har ett program-ID som är com.example.air.FriendlyApp och ett utgivar-ID som är 214649436BD677B62C33D02233043EA236D13934.1 , blir den domänsträng som du ska använda för att tillåta detta program att ansluta: app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934.1 . (Som i AIR 1.5.3 har inte alla AIR-program ett utgivar-ID.)