Komunikacja z innymi instancjami programu Flash Player lub programu AIR

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Klasa LocalConnection umożliwia komunikację między aplikacjami Adobe® AIR® oraz między treścią SWF działającą w przeglądarce. Klasy LocalConnection można również użyć do komunikacji między aplikacją AIR a treścią SWF działającą w przeglądarce. Klasa LocalConnection pozwala na budowanie bardzo elastycznych aplikacji współużytkujących dane między instancjami programu Flash Player i środowiska AIR.

Informacje o klasie LocalConnection

Klasa LocalConnection umożliwia tworzenie plików SWF, które mogą wysyłać instrukcje do innych plików SWF bez konieczności użycia metody fscommand() i języka JavaScript. Obiekty LocalConnection mogą się komunikować jedynie między plikami SWF uruchomionymi na tym samym komputerze klienckim, ale mogą również być uruchomione w różnych aplikacjach. Na przykład: plik SWF działający w przeglądarce i plik SWF działający w projektorze mogą korzystać z informacji. Projektor może przechowywać informacje lokalnie, a plik SWF oparty na przeglądarce może łączyć się zdalnie. (Projektor jest plikiem SWF zapisanym w formacie, który może działać jako aplikacja autonomiczna — tj. projektor nie wymaga programu Flash Player do zainstalowania, ponieważ jest osadzony w pliku wykonywalnym).

Obiekty LocalConnection mogą być używane w celu komunikacji między plikami SWF korzystającymi z różnych wersji języka ActionScript:

  • Obiekty ActionScript 3.0 LocalConnection mogą komunikować się z obiektami LocalConnection utworzonymi w języku ActionScript 1.0 lub 2.0.

  • Obiekty ActionScript 1.0 lub 2.0 LocalConnection mogą komunikować się z obiektami LocalConnection utworzonymi w języku ActionScript 3.0.

Program Flash Player obsługuje komunikację między obiektami LocalConnection różnych wersji w sposób automatyczny.

Najprostszym sposobem korzystania z obiektu LocalConnection jest umożliwienie komunikacji między obiektami LocalConnection utworzonymi w tej samej domenie lub tej samej aplikacji AIR. Dzięki temu zagadnienia bezpieczeństwa nie będą stanowiły problemu. Jeśli jednak wymagane jest umożliwienie komunikacji między domenami, istnieje kilka sposobów implementacji zabezpieczeń. Więcej informacji zawiera omówienie parametru connectionName metody send() oraz metod allowDomain() i domain w opisie klasy LocalConnection w Skorowidzu języka ActionScript 3.0 dla platformy Adobe Flash .

Obiekty LocalConnection mogą służyć do wysyłania i odbierania danych w jednym pliku SWF, ale Adobe nie zaleca wykonywania takich operacji. Należy w takich przypadkach korzystać z obiektów współużytkowanych.

Istnieją trzy sposoby dodawania metod wywołań zwrotnych do obiektów LocalConnection:

  • Utwórz podklasę klasy LocalConnection i dodaj metody.

  • Ustaw dla właściwości LocalConnection.client obiekt, który implementuje metody.

  • Utwórz klasę dynamiczną, która rozszerza klasę LocalConnection i dynamicznie dołącz metody.

Pierwszy sposób dodawania metod wywołań zwrotnych uwzględnia rozszerzenie klasy LocalConnection. Należy zdefiniować metody w klasie niestandardowej, a nie dodawać je dynamicznie do instancji LocalConnection. To podejście zostało przedstawione w poniższym kodzie:

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

W celu utworzenia nowej instancji klasy CustomLocalConnection należy użyć poniższego kodu:

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

Druga metoda dodawania metod wywołań zwrotnych obejmuje użycie właściwości LocalConnection.client . Korzystanie z tej właściwości wiąże się z tworzeniem niestandardowej klasy i przypisaniem nowej instancji do właściwości client , co przedstawia poniższy kod:

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

Właściwość LocalConnection.client wskazuje metody wywołań zwrotnych obiektu, jakie powinny być używane. W poprzednim kodzie dla właściwości client ustawiono nową instancję klasy niestandardowej CustomClient. Domyślną wartością właściwości client jest bieżąca instancja LocalConnection. Właściwość client może zostać użyta, jeśli istnieją dwa moduły obsługi danych, które zawierają ten sam zestaw metod, ale działają inaczej — na przykład: w aplikacji, w której przycisk w oknie przełącza widok w drugim oknie.

W celu utworzenia klasy CustomClient można użyć poniższego kodu:

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

Trzeci sposób dodania metod wywołań zwrotnych — tworzenie klasy dynamicznej i dynamiczne dołączenie metod — jest bardzo podobny do użycia klasy LocalConnection z poprzednich wersji języka ActionScript, co przedstawia poniższy kod:

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

Metody wywołań zwrotnych mogą być dynamicznie dodawane do tej klasy za pomocą poniższego kodu:

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

Poprzedni sposób dodawania metod wywołań zwrotnych nie jest zalecany, ponieważ kod nie jest przenośny. Ponadto użycie tej metody tworzenia lokalnych połączeń może spowodować zmniejszenie wydajności, ponieważ dostęp do właściwości dynamicznych odbywa się znacznie wolniej niż dostęp do właściwości statycznych.

Właściwość isPerUser

Właściwość isPerUser została dodana do programu Flash Player (10.0.32) oraz środowiska AIR (1.5.2) w celu rozwiązania konfliktu występującego, gdy do komputera Mac loguje się więcej niż jeden użytkownik. W innych systemach operacyjnych właściwość ta jest ignorowana, ponieważ połączenie lokalne ma zawsze zasięg przypisany do pojedynczego użytkownika. Właściwość isPerUser powinna być w nowym kodzie ustawiana na wartość true . Domyślną wartością jest jednak, ze względu na zachowanie zgodności z poprzednimi wersjami, wartość false . Wartość domyślna może zostać zmieniona w przyszłych wersjach środowisk wykonawczych.

Przesyłanie komunikatów między dwiema aplikacjami

Klasa LocalConnection pozwala na zrealizowanie komunikacji między różnymi aplikacjami AIR a różnymi aplikacjami Adobe® Flash® Player (SWF) działającymi w przeglądarce. Klasy LocalConnection można również użyć do komunikacji między aplikacją AIR a aplikacją SWF działającą w przeglądarce.

Przykład: na stronie sieci Web może istnieć wiele instancji Flash Player lub instancja programu Flash Player może pobierać dane z instancji Flash Player w oknie podręcznym.

W poniższym kodzie zdefiniowany jest obiekt LocalConnection, który pełni rolę serwera i przyjmuje przychodzące wywołania LocalConnection z innych aplikacji:
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"); 
            } 
        } 
    } 
}

Ten kod tworzy najpierw obiekt LocalConnection o nazwie lc i ustawia właściwość client na obiekt clientObject . Gdy inna aplikacja wywołuje metodę w tej instancji klasy LocalConnection, środowisko wykonawcze szuka odpowiedniej metody w obiekcie clientObject .

Jeśli istnieje już połączenie o określonej nazwie, nastąpi wygenerowanie wyjątku błędu argumentu, który oznacza, że próba połączenia nie powiodła się, ponieważ obiekt jest już połączony.

Gdy instancja Flash Player łączy się z plikiem SWF i podejmuje próbę wywołania dowolnej metody dla określonego połączenia lokalnego, wówczas żądanie jest wysyłane do klasy określonej przez właściwość client , dla której ustawiono klasę 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"); 
        } 
    } 
}

W celu utworzenia serwera LocalConnection należy wywołać metodę LocalConnection.connect() i udostępnić unikalną nazwę połączenia. Jeśli istnieje już połączenie o określonej nazwie, nastąpi wygenerowanie błędu ArgumentError, który oznacza, że próba połączenia nie powiodła się, ponieważ obiekt jest już połączony.

Poniższy urywek przedstawia sposób tworzenia nowego połączenia LocalConnection o nazwie conn1 :
try 
{ 
    connection.connect("conn1"); 
} 
catch (error:ArgumentError) 
{ 
    trace("Error! Server already exists\n"); 
}
Połączenie z podstawową aplikacją z drugorzędnej aplikacji wymaga utworzenia nowego obiektu LocalConnection w wysyłającym obiekcie LocalConnection, a następnie wywołania metody LocalConnection.send() z nazwą połączenia i nazwą metody do wykonania. Na przykład w celu wysłania metody doQuit do utworzonego wcześniej obiektu LocalConnection należy użyć poniższego kodu:
sendingConnection.send("conn1", "doQuit");

Ten kod nawiązuje połączenie z istniejącym obiektem LocalConnection (połączenie ma nazwę conn1 ), a następnie wywołuje metodę doMessage() w zdalnej aplikacji. Jeśli wymagane jest wysłanie parametrów do zdalnej aplikacji, należy określić dodatkowe argumenty po nazwie metody w metodzie send() , jak w poniższym urywku:

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

Połączenia z treścią w innych domenach i z aplikacjami AIR

Aby umożliwić komunikację tylko z określonych domen, należy wywołać metodę allowDomain() lub metodę allowInsecureDomain() klasy LocalConnection i przekazać listę zawierającej jedną lub wiele nazw domen, które mogą uzyskiwać dostęp do tego obiektu LocalConnection.

We wcześniejszych wersjach języka ActionScript metody LocalConnection.allowDomain() i LocalConnection.allowInsecureDomain() były metodami wywołania zwrotnego, które musiały być implementowane przez programistów i musiały zwracać wartość logiczną. W wersji ActionScript 3.0 metody LocalConnection.allowDomain() i LocalConnection.allowInsecureDomain() są metodami wbudowanymi, które mogą być wywoływane tak jak metody Security.allowDomain() i Security.allowInsecureDomain() — należy do nich wprowadzić jedną lub większą liczbę nazw dozwolonych metod.

W programie Flash Player 8 wprowadzono ograniczenia dla lokalnych plików SWF. Plik SWF, któremu zezwolono na dostęp do Internetu, nie może mieć również dostępu do lokalnego systemu plików. Jeśli zostanie określona wartość localhost , dostęp do pliku SWF będzie mógł uzyskać każdy lokalny plik SWF. Jeśli metoda LocalConnection.send() podejmie próbę komunikacji z plikiem SWF z bezpiecznego obszaru izolowanego, do którego kod wywołujący nie ma dostępu, wówczas następuje wywołanie zdarzenia securityError ( SecurityErrorEvent.SECURITY_ERROR ). W celu obejścia tego błędu można określić domenę wywołującą w metodzie aplikacji odbierającej LocalConnection.allowDomain() .

Istnieją dwie wartości specjalne, które można przekazać do metod LocalConnection.allowDomain() i LocalConnection.allowInsecureDomain() : * i localhost . Gwiazdka (*) umożliwia dostęp ze wszystkich domen. Ciąg znaków localhost umożliwia wywoływanie aplikacji z treści zainstalowanej lokalnie, ale poza katalogiem zasobów aplikacji.

Jeśli metoda LocalConnection.send() podejmie próbę komunikacji z aplikacją z obszaru izolowanego zabezpieczeń, do którego kod wywołujący nie ma dostępu, wówczas następuje wywołanie zdarzenia securityError ( SecurityErrorEvent.SECURITY_ERROR ). W celu obejścia tego błędu można określić domenę wywołującą w metodzie aplikacji odbierającej LocalConnection.allowDomain() .

Jeśli komunikacja jest implementowana tylko między treściami w tej samej domenie, można określić parametr connectionName , który nie rozpoczyna się od znaku podkreślenia ( _ ) i nie określa nazwy domeny (na przykład myDomain:connectionName ). Tego samego ciąg znaków należy użyć w wywołaniu LocalConnection.connect(connectionName) .

W przypadku implementacji komunikacji między treściami w różnych domenach należy określić parametr connectionName , który rozpoczyna się od znaku podkreślenia. Wprowadzenie znaku podkreślenia sprawia, że treść z obiektem odbierającym LocalConnection jest bardziej przenośna między domenami. Oto dwa możliwe przypadki:

  • Jeśli ciąg znaków dla parametru connectionName nie rozpoczyna się od znaku podkreślenia, środowisko wykonawcze dodaje przedrostek razem z nazwą naddomeny i znakiem dwukropka (np. myDomain:connectionName ). Chociaż ta metoda zapewnia, że połączenie użytkownika nie wejdzie w konflikt z połączeniami o tej samej nazwie z pozostałych domen, dla obiektów wysyłających LocalConnection należy określić tę samą naddomenę (np. myDomain:connectionName ). Jeśli plik HTML lub SWF z odbierającym obiektem LocalConnection zostanie przeniesiony do innej domeny, środowisko wykonawcze zmieni przedrostek tak, aby odzwierciedlał nową naddomenę (na przykład anotherDomain:connectionName ). Wszystkie wysyłające obiekty LocalConnection należy edytować ręcznie tak, aby wskazywały na nową naddomenę.

  • Jeśli ciąg znaków dla parametru connectionName rozpoczyna się znakiem podkreślenia (np. _connectionName ), środowisko wykonawcze nie dodaje przedrostka do ciągu. Oznacza to, że wysyłające i odbierające obiekty LocalConnection korzystają z takich samych ciągów znaków dla parametru connectionName . Jeśli obiekt odbierający korzysta z metody LocalConnection.allowDomain() w celu określenia, że połączenia ze wszystkich domen będą akceptowane, plik HTML lub SWF z obiektem odbierającym LocalConnection może zostać przeniesiony do innej domeny bez zmieniania jakiegokolwiek obiektu wysyłającego LocalConnection.

    Wadą używania nazw ze znakiem podkreślenia w parametrze connectionName jest ryzyko kolizji, np. przy próbie nawiązania połączeń przez dwie aplikacje posługujące się tą samą nazwą connectionName . Druga wada ma związek z bezpieczeństwem. Nazwy połączeń zawierające znak podkreślenia nie identyfikują domeny aplikacji wykrywającej próbę połączenia. Dlatego preferowane są nazwy kwalifikowane domeną.

Środowisko Adobe AIR

W celu nawiązania komunikacji z treścią uruchamianą w obszarze izolowanym aplikacji AIR (treścią instalowaną za pomocą aplikacji AIR) konieczne jest poprzedzenie nazwy połączenia superdomeną identyfikującą aplikację AIR. Ciąg superdomeny rozpoczyna się od znaków app# , po którym następuje identyfikator aplikacji oraz kropka (.), po której z kolei następuje identyfikator wydawcy (o ile został on zdefiniowany). Na przykład właściwa superdomena, która ma zostać użyta w parametrze connectionName dla aplikacji o identyfikatorze aplikacji, com.example.air.MyApp , w przypadku braku identyfikatora wydawcy, to: "app#com.example.air.MyApp" . Wówczas, jeśli nazwa połączenia podstawowego to "appConnection", cały ciąg, który ma być użyty w parametrze connectionName , to: "app#com.example.air.MyApp:appConnection" . Jeśli aplikacja ma identyfikator wydawcy, wówczas ten identyfikator musi zostać uwzględniony również w ciągu superdomeny: "app#com.example.air.MyApp.B146A943FBD637B68C334022D304CEA226D129B4.1" .

Aby zezwolić innej aplikacji AIR na komunikowanie się z naszą aplikacją przez połączenie lokalne, należy wywołać metodę allowDomain() obiektu LocalConnection z nazwą domeny połączenia lokalnego. W przypadku aplikacji AIR ta nazwa domeny jest tworzona na podstawie identyfikatorów aplikacji i wydawcy, na tej samej zasadzie, co ciąg znaków połączenia. Na przykład, jeśli wysyłająca aplikacja AIR ma identyfikator aplikacji com.example.air.FriendlyApp oraz identyfikator wydawcy 214649436BD677B62C33D02233043EA236D13934.1 , wówczas ciąg znaków domeny zezwalający tej aplikacji na nawiązywanie połączeń ma postać: app#com.example.air.FriendlyApp.214649436BD677B62C33D02233043EA236D13934.1 . (Począwszy od środowiska AIR w wersji 1.5.3, nie wszystkie aplikacje AIR mają identyfikatory wydawcy.)