Grundläggande om nätverk och kommunikationFlash Player 9 och senare, Adobe AIR 1.0 och senare När du skapar program i Flash Player eller AIR behöver du ofta ha tillgång till resurser utanför programmet. Du kanske till exempel vill skicka en begäran för en bild på en webbserver på Internet och få tillbaka bildens data. Eller så kanske du vill skicka serialiserade objekt fram och tillbaka via en socketanslutning med en programserver. API:erna i Flash Player och AIR innehåller klasser som gör det möjligt för dina program att delta i den här överföringen. Dessa API:er stöder IP-baserade nätverk för protokoll som UDP, TCP, HTTP, RTMP och RTMFP. Följande klasser kan användas för att skicka och ta emot data över ett nätverk:
När du skapar ett webbprogram kan det ofta vara användbart att kontinuerligt lagra information om användarens programläge. HTML-sidor och program använder vanligtvis cookies för det. I Flash Player kan klassen SharedObject användas för detta. Se Delade objekt. (Klassen SharedObject kan användas i AIR-program, men det är färre begränsningar när data helt enkelt sparas till en vanlig fil.) När ditt Flash Player- eller AIR-program behöver kommunicera med ett annat Flash Player- eller AIR-program på samma dator kan du använda klassen LocalConnection. Till exempel kan två (eller flera) SWF-filer på samma webbsida kommunicera sinsemellan. På samma sätt kan en SWF-fil som körs på en webbsida kommunicera med ett AIR-program. Se Kommunicera med andra Flash Player- och AIR-instanser. Om du behöver kommunicera med annat än SWF-filer på den lokala datorn kan du använda klassen NativeProcess i AIR 2. Med hjälp av klassen NativeProcess kan ditt AIR-program starta och kommunicera med andra program. Se Kommunicera med interna processer i AIR. Om du behöver information om nätverksmiljön för den dator på vilken ett AIR-program körs kan du använda följande klasser:
Viktiga termer och begreppFöljande referenslista innehåller viktiga termer som du kommer att stöta på när du programmerar nätverks- och kommunikationskod:
NätverksgränssnittDu kan använda NetworkInfo-objektet för att identifiera de nätverksgränssnitt för hårdvara och mjukvara som finns tillgängliga för programmet. NetworkInfo-objektet är ett singleton-objekt, du behöver inte skapa något. Använd i stället den statiska klassegenskapen networkInfo om du vill komma åt det enskilda NetworkInfo-objektet. NetworkInfo-objektet skickar också en networkChange-händelse när något av de tillgängliga gränssnitten ändras. Anropa metoden findInterfaces() för att hämta en lista med NetworkInterface-objekt. Varje NetworkInterface-objekt i listan beskriver ett av de tillgängliga gränssnitten. NetworkInterface-objektet tillhandahåller sådan information som IP-adress, maskinvaruadress, största överföringsenhet och om gränssnittet är aktivt eller inte. I följande kodexempel spåras NetworkInterface-egenskaper för alla gränssnitt på klientdatorn: 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 ); } } } } } } Mer information finns i: Ändringar i nätverksanslutningAIR-programmet kan köras i miljöer där nätverksanslutningen är osäker och ändras. Om en nätverksanslutning blir tillgänglig eller inte längre kan användas, skickar Adobe AIR en nätverksändringshändelse. Det blir då lättare för ett program att hantera anslutningarna till olika onlineresurser. Både NetworkInfo-objektet och programmets NativeApplication-objekt skickar händelsen networkChange. Om programmet ska reagera på den här händelsen lägger du till en lyssnare: NetworkInfo.networkInfo.addEventListener(Event.NETWORK_CHANGE, onNetworkChange); Ange också en händelsehanterarfunktion: function onNetworkChange(event:Event) { //Check resource availability } Händelsen networkChange indikerar inte någon ändring i all nätverksaktivitet, utan bara att en enskild nätverksanslutning har ändrats. AIR försöker inte tolka innebörden av den här nätverksändringen. En nätverksansluten dator kan ha många verkliga och virtuella anslutningar. Att en anslutning försvinner behöver alltså inte innebära att en resurs går förlorad. Nya anslutningar garanterar inte heller förbättrad resurstillgänglighet. Ibland kan en ny anslutning till och med blockera åtkomst till resurser som varit tillgängliga tidigare (till exempel vid anslutning till VPN). Vanligtvis kan ett program bara avgöra om det kan ansluta till en fjärresurs genom att prova. I ramverket för tjänstövervakning tillhandahålls en händelsebaserad metod att svara på ändringar i nätverksanslutning till en angiven värd. Obs! Ramverket för tjänstövervakning upptäcker om en server svarar godkännande på en begäran. Att kontrollen slutförs garanterar inte fullständig anslutning. Skalbara webbtjänster använder ofta program för cachelagring och belastningsutjämning för att dirigera om trafik till ett kluster med webbservrar. I en sådan situation kan tjänsteleverantörerna bara tillhandahålla en ofullständig diagnos för nätverksanslutningen.
TjänstövervakningTjänstövervakningens ramverk, som är skilt från AIR-ramverket, finns i filen aircore.swc. Om det här ramverket ska kunna användas måste filen aircore.swc tas med i ditt programbygge. I Adobe® Flash® Builder inkluderas det här biblioteket automatiskt. Klassen ServiceMonitor implementerar ramverket för övervakning av nätverkstjänster och ger en basfunktion för tjänstövervakning. Som standard skickar en instans av klassen ServiceMonitor händelser avseende nätverksanslutning. ServiceMonitor-objektet skickar dessa händelser när instansen skapas och när körningstiden upptäcker en nätverksändring. Du kan dessutom ställa in egenskapen pollInterval i en ServiceMonitor-instans så att anslutningen kontrolleras vid ett angivet intervall i millisekunder, oavsett vanliga nätverksanslutningshändelser. Ett ServiceMonitor-objekt kontrollerar inte nätverksanslutningen förrän metoden start() anropas. Klassen URLMonitor, en underklass till klassen ServiceMonitor, upptäcker ändringar i HTTP-anslutningen för en angiven URLRequest. Klassen SocketMonitor, som också är en underklass till klassen ServiceMonitor, upptäcker ändringar i anslutningen till en särskild värd vid en särskild port. Obs! Före AIR 2 publicerades tjänstövervakningens ramverk i servicemonitor.swc-biblioteket. Detta bibliotek är nu inaktuellt. Du ska använda aircore.swc-biblioteket i stället.
Flash CS4 och CS5 ProfessionalSå här använder du dessa klasser i Adobe® Flash® CS4 eller CS5 Professional:
Flash CS3 ProfessionalOm du vill använda dessa klasser i Adobe® Flash® CS3 Professional drar du komponenten ServiceMonitorShim från komponentpanelen till biblioteket och lägger sedan till följande import-sats till ActionScript 3.0-koden: import air.net.*; HTTP-övervakningKlassen URLMonitor bestämmer om HTTP-begäran ska göras till en angiven adress vid port 80 (den vanliga porten för HTTP-kommunikation). Följande kod använder en instans av klassen URLMonitor för att identifiera anslutningsändringar för Adobes webbplats: 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); } SocketövervakningAIR-program kan också använda socketanslutningar för anslutning av push model-typ. Nätverkskommunikation via otillåtna portar begränsas vanligtvis av brandväggar och nätverksroutrar av säkerhetsskäl. Utvecklarna måste därför tänka på att användarna kanske inte alltid har möjlighet att skapa socketanslutningar. Följande kod använder en instans av klassen SocketMonitor för att identifiera anslutningsändringar för en socketanslutning. Porten som övervakas är 6667, en gemensam port för 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); } Om socketservern kräver en säker anslutning kan du använda klassen SecureSocketMonitor istället för SocketMonitor. DNS-poster (Domain Name System)Du kan leta upp DNS-resursposter med hjälp av klassen DNSResolver. I DNS-resursposter tillhandahålls information som IP-adressen för ett domännamn och domännamnet för en IP-adress. Du kan leta upp följande typer av DNS-resursposter:
Om du vill leta upp en post skickar du en frågesträng och det klassobjekt som representerar posttypen till lookup()-metoden för DNSResolver-objektet. Vilken frågesträng som ska användas beror på posttypen:
I följande kodexempel letas IP-adressen för värden "example.com" upp. 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 ); } } } Mer information finns i: |
|