Podstawowe informacje o pracy w sieci i komunikacjiFlash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje Podczas tworzenia aplikacji w programach Flash Player lub AIR często wymagane jest uzyskanie dostępu do zasobów spoza aplikacji. Na przykład, wymagane może być wysłanie żądania obrazu na serwer sieci WWW i uzyskanie zwróconych danych obrazu. Możliwe może też być wysłanie serializowanych obiektów i odebranie ich z powrotem poprzez połączenie przez gniazdo z serwerem aplikacji. Interfejsy API programu Flash Player i AIR udostępniają kilka klas umożliwiających aplikacjom uczestnictwo w takiej wymianie. Te interfejsy API obsługują pracę w sieci opartą na adresie IP dla protokołów takich, jak UDC, TCP, HTTP, RTMP i RTMFP. Poniższe klasy można wykorzystać w celu wysłania i pobrania danych przez sieć:
Często podczas tworzenia aplikacji sieci WWW przydatne jest zapisywanie trwałych informacji o stanie aplikacji użytkownika. Strony i aplikacje HTML zazwyczaj wykorzystują do tego celu pliki cookie. W programie Flash Player w tym samym celu można użyć klasy SharedObject. Patrz część Obiekty udostępnione. (Klasa SharedObject może być wykorzystywana w aplikacjach AIR, ale zdecydowanie mniej ograniczeń będzie obowiązywać, jeśli dane zostaną po prostu zapisane do zwykłego pliku.) Gdy w aplikacji środowiska Flash Player lub AIR wymagana jest komunikacja z inną aplikacją środowiska Flash Player lub AIR na tym samym komputerze, można zastosować klasę LocalConnection. Na przykład, dwa (lub więcej) pliki SWF na tej samej stronie WWW mogą komunikować się ze sobą. Podobnie, plik SWF działający na stronie WWW może komunikować się z aplikacją środowiska AIR. Patrz część Komunikacja z innymi instancjami programu Flash Player lub programu AIR. Gdy wymagana jest komunikacją z innym, różnym od SWF procesem na lokalnym komputerze, można zastosować klasę NativeProcess, która została dodana w programie AIR 2. Klasa NativeProcess umożliwia aplikacji środowiska AIR uruchomienie innych aplikacji i komunikację z nimi. Patrz część Komunikacja z procesami rodzimymi w środowisku AIR. Gdy wymagane są informacje na temat środowiska sieciowego komputera, na którym uruchomiona jest aplikacja AIR, można skorzystać z następujących klas:
Ważne pojęcia i terminyNa poniższej liście wyjaśniono znaczenie ważnych terminów stosowanych w kontekście programowania obsługi sieci i komunikacji.
Interfejsy siecioweObiektu NetworkInfo można używać do wykrywania sprzętowych i programowych interfejsów sieciowych dostępnych dla aplikacji. NetworkInfo jest obiektem typu singleton; nie trzeba go jawnie tworzyć. Dostęp do jedynego istniejącego obiektu NetworkInfo uzyskuje się za pośrednictwem statycznej właściwości klasy, networkInfo. Obiekt NetworkInfo wywołuje również zdarzenie networkChange, gdy zajdzie zmiana w jednym z dostępnych interfejsów. Aby uzyskać listę obiektów NetworkInterface, należy wywołać metodę findInterfaces(). Każdy obiekt NetworkInterface na liście opisuje jeden z dostępnych interfejsów. Obiekt NetworkInterface zawiera takie informacje, jak adres IP, adres sprzętowy, rozmiar maksymalnej jednostki transmisji (MTU) i status aktywności interfejsu. Poniższy przykładowy kod wyświetla właściwości NetworkInterface każdego z interfejsów komputera klienckiego: package {
import flash.display.Sprite;
import flash.net.InterfaceAddress;
import flash.net.NetworkInfo;
import flash.net.NetworkInterface;
public class NetworkInformationExample extends Sprite
{
public function NetworkInformationExample()
{
var networkInfo:NetworkInfo = NetworkInfo.networkInfo;
var interfaces:Vector.<NetworkInterface> = networkInfo.findInterfaces();
if( interfaces != null )
{
trace( "Interface count: " + interfaces.length );
for each ( var interfaceObj:NetworkInterface in interfaces )
{
trace( "\nname: " + interfaceObj.name );
trace( "display name: " + interfaceObj.displayName );
trace( "mtu: " + interfaceObj.mtu );
trace( "active?: " + interfaceObj.active );
trace( "parent interface: " + interfaceObj.parent );
trace( "hardware address: " + interfaceObj.hardwareAddress );
if( interfaceObj.subInterfaces != null )
{
trace( "# subinterfaces: " + interfaceObj.subInterfaces.length );
}
trace("# addresses: " + interfaceObj.addresses.length );
for each ( var address:InterfaceAddress in interfaceObj.addresses )
{
trace( " type: " + address.ipVersion );
trace( " address: " + address.address );
trace( " broadcast: " + address.broadcast );
trace( " prefix length: " + address.prefixLength );
}
}
}
}
}
}
Aby znaleźć więcej informacji na ten temat, zobacz: Zmiany stanu połączeń sieciowychAplikacja AIR może działać w środowiskach, w których stan połączeń sieciowych będzie zmienny lub niestabilny. Aby ułatwić zarządzanie połączeniami z zasobami sieciowymi w ramach aplikacji, środowisko AIR wysyła zdarzenie zmiany stanu sieci za każdym razem, gdy połączenie sieciowe stanie się dostępne lub niedostępne. Zarówno obiekt NetworkInfo, jak i obiekt NativeApplication aplikacji wywołują zdarzenie networkChange. Aby zareagować na to zdarzenie, należy dodać detektor: NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); Oraz zdefiniować funkcję obsługi zdarzenia: function onNetworkChange(event:Event)
{
//Check resource availability
}
Zdarzenie networkChange nie oznacza każdej zmiany w aktywności sieci, a jedynie zmianę stanu jednego z połączeń sieciowych. Środowisko AIR nie próbuje interpretować znaczenia zmiany stanu połączenia sieciowego. Komputer pracujący w sieci może mieć wiele połączeń rzeczywistych i wirtualnych, a zatem utrata połączenia nie musi być równoznaczna z utratą dostępu do zasobu. Z drugiej strony, nowe połączenia nie gwarantują lepszej dostępności zasobu. Niekiedy nowe połączenie może nawet zablokować dostęp do zasobów, które były wcześniej dostępne (na przykład w wypadku połączenia z siecią VPN). Co do zasady, jedynym sposobem sprawdzenia, czy aplikacja może połączyć się z zasobem zdalnym, jest podjęcie próby takiego połączenia. Architektura monitorowania usług udostępnia oparty na zdarzeniach mechanizm reagowania na zmiany stanu połączeń sieciowych z konkretnym hostem. Uwaga: Architektura monitorowania usług wykrywa, czy serwer w sposób akceptowalny reaguje na żądanie. Pozytywny wynik sprawdzenia nie gwarantuje pełnej łączności. Skalowalne usługi Web Service często korzystają z mechanizmów buforowania i równoważenia ruchu, które przekierowują ruch do klastra serwerów sieci Web. W takiej sytuacji dostawcy usług zapewniają tylko częściową diagnostykę łączności sieciowej.
Monitorowanie usługArchitektura monitorowania usług, odrębna od architektury AIR, rezyduje w pliku aircore.swc. Aby skorzystać z tej architektury, należy uwzględnić plik aircore.swc w procesie budowania. Program Adobe® Flash® Builder uwzględnia tę bibliotekę automatycznie. Klasa ServiceMonitor implementuje architekturę monitorowania usług sieciowych i udostępnia podstawową funkcjonalność dla monitorów usług. Domyślnie instancja klasy ServiceMonitor wywołuje zdarzenia dotyczące połączeń sieciowych. Obiekt ServiceMonitor wywołuje te zdarzenia przy tworzeniu instancji i za każdym razem, gdy środowisko wykonawcze wykryje zmianę stanu sieci. Ponadto możliwe jest ustawienie właściwości pollInterval instancji klasy ServiceMonitor w taki sposób, aby stan połączeń był sprawdzany co zadaną liczbę milisekund, niezależnie od zdarzeń zmiany stanu połączeń sieciowych. Obiekt ServiceMonitor nie sprawdza połączeń sieciowych, zanim nie zostanie wywołana metoda start(). Klasa URLMonitor, będąca podklasą klasy ServiceMonitor, wykrywa zmiany w połączeniach HTTP dla określonego obiektu URLRequest. Klasa SocketMonitor, która również jest podklasą klasy ServiceMonitor, wykrywa zmiany w łączności z określonym hostem na określonym porcie. Uwaga: W wersjach środowiska AIR wcześniejszych niż 2 struktura monitora usług była publikowana w bibliotece servicemonitor.swc. Ta biblioteka ma obecnie status przestarzałej. Należy zamiast niej używać biblioteki aircore.swc.
Flash CS4 i CS5 ProfessionalAby skorzystać z tych klas w programie Adobe® Flash® CS4 lub CS5 Professional:
Flash CS3 ProfessionalAby użyć klas w programie Adobe® Flash® CS3 Professional, należy przeciągnąć składnik ServiceMonitorShim z panelu Składniki do Biblioteki. Następnie należy dodać poniższą instrukcję import do kodu w języku ActionScript 3.0: import air.net.*; Monitorowanie połączeń HTTPKlasa URLMonitor określa, czy możliwe jest wysyłanie żądań HTTP do określonego adresu na port 80 (typowy port używany w komunikacji HTTP). W poniższym kodzie użyto instancji klasy URLMonitor w celu wykrywania zmian w łączności z witryną firmy Adobe: import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;
var monitor:URLMonitor;
monitor = new URLMonitor(new URLRequest('http://www.example.com'));
monitor.addEventListener(StatusEvent.STATUS, announceStatus);
monitor.start();
function announceStatus(e:StatusEvent):void {
trace("Status change. Current status: " + monitor.available);
}
Monitorowanie gniazdAplikacje AIR mogą także używać połączeń z gniazdami do realizacji łączności w modelu aktywnym (ang. push). Zapory i routery sieciowe zazwyczaj ze względów bezpieczeństwa uniemożliwiają komunikację sieciową przez nieupoważnione porty. Dlatego programiści muszą brać pod uwagę fakt, że użytkownik nie zawsze może nawiązać połączenie przez gniazdo. W poniższym kodzie użyto instancji klasy SocketMonitor w celu wykrywania zmian w połączeniu z gniazdem. Monitorowany jest port 6667 — używany zwykle dla protokołu IRC. import air.net.ServiceMonitor;
import flash.events.StatusEvent;
socketMonitor = new SocketMonitor('www.example.com',6667);
socketMonitor.addEventListener(StatusEvent.STATUS, socketStatusChange);
socketMonitor.start();
function announceStatus(e:StatusEvent):void {
trace("Status change. Current status: " + socketMonitor.available);
}
Jeżeli serwer gniazda wymaga bezpiecznego połączenia, można użyć klasy SecureSocketMonitor zamiast klasy SocketMonitor. Rekordy usługi DNS (Domain Name System)Klasa DNSResolver umożliwia wyszukiwanie rekordów zasobów DNS. Rekordy DNS zawierają takie informacje, jak adres IP przypisany do nazwy domeny oraz nazwa domeny przypisana do adresu IP. Istnieje możliwość wyszukiwania następujących typów rekordów zasobów DNS:
Aby wyszukać rekord, należy przekazać ciąg znaków zapytania i obiekt klasy reprezentujący typ rekordu do metody lookup() obiektu DNSResolver. Ciąg znaków zapytania powinien odpowiadać typowy rekord:
Poniższy przykładowy kod wyszukuje adres IP hosta "example.com". package
{
import flash.display.Sprite;
import flash.events.DNSResolverEvent;
import flash.events.ErrorEvent;
import flash.net.dns.ARecord;
import flash.net.dns.DNSResolver;
public class DNSResolverExample extends Sprite
{
public function DNSResolverExample()
{
var resolver:DNSResolver = new DNSResolver();
resolver.addEventListener( DNSResolverEvent.LOOKUP, lookupComplete );
resolver.addEventListener( ErrorEvent.ERROR, lookupError );
resolver.lookup( "example.com.", ARecord );
}
private function lookupComplete( event:DNSResolverEvent ):void
{
trace( "Query string: " + event.host );
trace( "Record count: " + event.resourceRecords.length );
for each( var record:* in event.resourceRecords )
{
if( record is ARecord ) trace( record.address );
}
}
private function lookupError( error:ErrorEvent ):void
{
trace("Error: " + error.text );
}
}
}
Aby znaleźć więcej informacji na ten temat, zobacz: |
|