Bygge en P2P nettverk Stem System Bruke RTMFP

Building et P2P nettverk Stem System Bruke RTMFP
Del
Del
Del
Del
Dette Cyber ​​Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

Flash Player 10 brakte oss RTMFP protokollen, deretter 10.1 oppdateringen lagt flash.net.NetGroup detaljnivå. Hva betyr dette for oss? Kort svar: lett peer to peer kommunikasjon. Ikke så korte svaret: Zero-konfigurasjon nettverk til utveksling melding mellom flere Flash Player kunder ..


Vi vil ta en titt på hva RTMFP er, hvordan det kan være bruk i et LAN selv uten å bruke Adobes Cirrus Server, så vil vi begynne å implementere våre klasser for å bruke nettgruppa funksjoner. Første milepæl vil være en svært grunnleggende og enkel chat-klient for å se at meldinger utveksles, og da vil vi gå videre og utvikle en stemme søknad om å bygge noe mer nær virkelige verden programmer.



Final Resultatet Preview

La oss ta en titt på det endelige resultatet vi skal jobbe mot. Bare åpne denne flash søknaden flere ganger (innen flere nettlesere, eller flere faner, eller flere datamaskiner på samme LAN). Du vil være i stand til å ha en eneste stemme leder i gruppen, og så snart en leder er satt de andre vil automatisk bli satt til klienter. Deretter lederen kan redigere et spørsmål og sine svar, og deretter sende den til gruppen. Resultatene oppdateres i sanntid, og deretter vises av alle datamaskiner /nettlesere av gruppen. Husk at ingen nettverkskonfigurasjon som skal gjøres, er ingen server involvert. Jeg antar at du begynner å se potensialet av disse funksjonene for LAN-programmer sammenhengende flere datamaskiner

Åpne et annet eksemplar i et nytt vindu



Trinn 1:.? Real Time Media Flow Protocol

RTMFP står for Real Time Media Flow Protocol. Denne nettverksprotokoll er utviklet av Adobe og offentliggjort i Flash Player 10 og AIR 1.5. For å omskrive Adobes Labs side, er en lav latency protokoll med peer-to-peer-evner (blant annet). Vi vil ikke gå dypt i detaljer her om hvordan det fungerer, fordi alt er beskrevet i Cirrus-siden på Adobe Labs siden.

Denne protokollen muliggjør automatisk tjeneste funn, noe som er ganske like Apples Bonjour protokoll. Fra en Flash-utvikleren point-of-view, det er en komplisert ting under panseret som muliggjør automatisk oppdagelse av andre kunder av vår "service" i nettverket. Da våre Flash kunder vil sende meldinger (data eller media) direkte til hver andre. I Flash Player 10.0 disse tilkoblingene var grei: forlaget peer sendte data til alle andre peer. Nå i 10.1 har vi multicast og hver node kan automatisk fungere som en stafett for å sende data til neste node.

Hva er multicast? I tradisjonelle nettverkskommunikasjon vi ofte arbeider i unicast-modus, som HTTP forespørsel, en melding mellom to aktører over nettverket. For å sende data til flere mål, kan du først tenke på unicast kringkasting, som sender data for hvert mål. Hvis du har n
mål, er dataene send n
ganger. Ganske dyrt. Så vi kan tenke på sendingen. For å gjøre det veldig enkelt, er kringkasting sender dataene til hver node i nettverket. Det betyr at vi også sende det til datamaskiner som ikke er interessert i denne meldingen. Det kan gjøre jobben, men det skaper ekstra båndbredde til nettverksnoder som ikke er interessert av våre data. Deretter kom de multicast, som er den type av veien for å overføre data som er brukt i RTMFP. Multicast sende en eneste melding, deretter nettverksnoder vil ta vare på sin distribusjon og replikering når det er nødvendig. Dette er en veldig kort oppsummering, og Wikipedias routing side gjør en god jobb for å gå videre inn i dette.

Hva er viktig for oss er å vite at noe komplisert og optimalisert skjer under panseret, og at vi trenger en gyldig multicast adresse. Så hva er en gyldig multicast-adresse? Utvalget av IP-adresser vi kan bruke har blitt satt av IANA. For IPv4, kan vi velge ett i 224.0.0.0 til 239.255.255.255 rekkevidde, men noen adresser er reservert: hele 224.0.0.0 til 224.0.0.255 bør ikke brukes. Men noen adresser utenfor dette området er også reservert. For å få den offisielle listen er det bare å se på IANA offisielle listen for å se om den adressen du har tenkt å bruke er reservert. I de neste trinnene vil vi bruke 239.252.252.1 som vår multicast adresse. Vite om din adresse er gyldig multicast man kan være nyttig for deg å feilsøke prosjektet, som en vanlig feil er å bruke tradisjonelle unicast-adresse som 192.168.0.3. For å forberede deg til fremtiden, må gyldig multicast-adresser når du skal bruke IPv6 være i området ff00 :: /8

En endelig notat:. Adobes Cirrus Server aktivere peer funn utenfor ditt LAN (dvs. over Internett). For å kunne bruke Cirrus server, du må bare registrere deg for å ha en Cirrus utviklernøkkel. Når du bruker RTMFP uten Cirrus server, vil vi ha alle peer-to-peer-funksjoner, men begrenset til det lokale nettverket.



Trinn 2: OK, nå vil jeg se noen kode

Så Flash Player støtter nå RTMFP!. Flott. Men hvordan bruker vi det? Tilkoblingen magien skjer i flash.net.NetConnection klassen. Og gruppen støtte lagt til av Flash Player 10.1 er gjort gjennom flash.net.NetGroup klassen.

I de neste trinnene vil vi se på sammenhengen prosessen og hvilke søkeord som er involvert, og da vil vi flette dette sammen . Så la oss starte med å liste opp hva vi trenger for å lage en forbindelse:



Lagre en instans NetConnection

Selvsagt trenger vi en forekomst av NetConnection, som er inkludert i versjon 4.1 av Flex SDK. Dette NetConnection objekt eksponerer en connect () offentlig metode. Ifølge denne metoden dokumentasjon, koble () venter på en RTMFP URL å skape peer-to-peer-tilkobling og IP Multicast kommunikasjon. For en enkel LAN peer-to-peer-funnet, ved hjelp av "rtmfp:" er nok. For hjelp kontakt med Cirrus server, vi må bare legge til serveren og devkey strenger til denne adressen. Dette gir en veldig enkel tilkoblingsmetode i vår manager: Twitter /** * Bruk en server rtmfp gjør arbeidet for lokale subnettet peer oppdagelse. * For bruken av internett med Cirrus server, noe som * rtmfp: //cirrus.adobe.com/"; vil være mer nyttig * /public Var _rtmfpServer: String =" rtmfp: "; /** * Hvis du bruker en Cirrus server, bør du legge til utvikleren nøkkelen her * /public Var _cirrusDevKey: String = ""; beskyttet Var netConnection: NetConnection = null; offentlig funksjon koble (): void {netConnection = new NetConnection (); netConnection.addEventListener (NetStatusEvent.NET_STATUS , netConnection_netStatusHandler, falsk, 0, true); netConnection.connect (_rtmfpServer + _cirrusDevKey);}

Jeg antar gjennom denne opplæringen som du vil importere de nødvendige klasser selv, eller at IDE vil gjøre det for deg

Når vi har kalt netConnection.connect () metoden, må vi vente og lytte til en NetStatusEvent.NET_STATUS hendelse med sin info.code eiendom "NetConnection.Connect.Success". Denne suksessen info fortell oss netConnection er klar, så vi vil være i stand til å skape en nettgruppe i vår netConnection_onConnectSuccess () -metoden. Twitter /** * Tilbakering for NetStatusEvent.NET_STATUS hendelser på min netConnection * objekt, sett i connect () metoden * *param event * /private funksjon netConnection_netStatusHandler (event: NetStatusEvent): void {switch (event.info.code) {//Håndtak forbindelse suksess tilfelle NetConnectionCodes.CONNECT_SUCCESS: netConnection_onConnectSuccess (); gå i stykker; //...



Creating den NetGroup

nettgruppa vil være "lobby" der våre kolleger kommunisere. Derfor må det spesifiseres. Det er hva flash.net.GroupSpecifier klassen er beregnet for. Sin konstruktør venter på et gruppenavn som skal identifisere gruppen vår. Vi vil komponere dette navnet med en applicationName og en groupname suffiks. På denne måten vil det være enkelt å lage flere grupper i de samme programmene uten å endre nettgruppa leder vi skaper. Netgruppen klasse eksponerer flere nyttige parametre:

multicastEnabled, som brukes for bekker (ved bruk med en netStream.play () eller netStream.publish () metoder). I vårt tilfelle vil vi ikke jobbe med media, men jeg fortsatt holde denne eiendom her til fordi det er veldig nyttig for media; det er falsk som standard

objectReplicationEnabled er en boolsk -. falsk som standard - som spesifiserer om det replikering er aktivert. For å sende enkelt budskap som kan være akkurat det samme, men på forskjellige tider (som et varsel om en ny forekomst av samme hendelse), fant jeg svært nyttig å eksplisitt sette den til å true, ellers noen jevnaldrende kan være litt for smart og ville tror de allerede sendt denne meldinger, og derfor ikke vil gjenskape det til neste node, slik at ikke alle peer av gruppen får ny forekomst av meldingen.

postingEnabled, falsk som standard, satt dersom oppslaget er tillatt i gruppen. Selvfølgelig vil vi sette den til å true, som hver peer vil sende sin oppdatering via denne mekanismen.

  • routingEnabled gir direkte ruting i nettgruppa.

    ipMulticastMemberUpdatesEnabled er et flagg som lar IP multicast stikkontakter. Dette forbedrer P2P ytelse i et LAN sammenheng. Som vårt eksempel vil bli LAN-basert, vil vi selvsagt sette den til å true.
  • serverChannelEnabled hjelp peer oppdagelse ved å skape en kanal på Cirrus server. Som vi ikke vil bruke Cirrus i vårt eksempel, vil vi se bort fra det nå.

    Når vi har satt alle disse egenskapene som passer vårt behov, setter vi multicast-adressen vi skal bruke å koble sammen data i vår gruppe. Dette gjøres ved å ringe groupSpecifier.addIPMulticastAddress ("239.252.252.1:20000") metode. Nå er alt satt opp, vi må bare opprette en forekomst av NetGroup med denne parameteren for å gjøre gruppen tilkoblingen skjer: Twitter /** * applicationName er den felles delen av groupSpecifier navnet vi skal bruke * /public Div applicationName: String = "active.tutsplus.examples.netGroup /"; /** * groupname legges til applicationName å kunne håndtere flere * grupper for samme program enkelt. * /public Var groupname: String = "demoGroup"; /** * Tilbakering for NetConnectionCodes.CONNECT_SUCCESS netto status for min * netConnection objekt. * /private funksjon netConnection_onConnectSuccess (): void {var groupSpecifier: GroupSpecifier; groupSpecifier = new GroupSpecifier (applicationName + groupname); groupSpecifier.multicastEnabled = true; groupSpecifier.objectReplicationEnabled = true; groupSpecifier.postingEnabled = true; groupSpecifier.routingEnabled = true; groupSpecifier.ipMulticastMemberUpdatesEnabled = true; groupSpecifier.addIPMulticastAddress ("239.252.252.1:20000"); NetGroup = new NetGroup (netConnection, groupSpecifier.groupspecWithAuthorizations ()); netGroup.addEventListener (NetStatusEvent.NET_STATUS, netGroup_statusHandler);}

    Så netgruppen sende en NetStatusEvent.NET_STATUS hendelse med sin kode eiendom "NetGroup.Connect.Success" når den er klar til bruk. Nå kan vi begynne å bruke netGroup.post (objekt) metoden for å sende meldinger til våre kolleger.

    Vi har snakket litt om det NetStatusEvent som gir oss sammenhengen suksess info. Men det er også nyttig for å hente alt som skjer i vår netConnection eller nettgruppa. Derfor vil vi legge til noen verdier i en switch /case tre for å få de aktuelle verdiene for NetStatusEvent for vår netConnection:
    slå (event.info.code) {//Håndtak forbindelse suksess tilfelle NetConnectionCodes.CONNECT_SUCCESS: netConnection_onConnectSuccess (); gå i stykker; //Håndtak hvert tilfelle av frakobling saken NetConnectionCodes.CONNECT_CLOSED: case NetConnectionCodes.CONNECT_FAILED: case NetConnectionCodes.CONNECT_REJECTED: case NetConnectionCodes.CONNECT_APPSHUTDOWN: case NetConnectionCodes.CONNECT_INVALIDAPP: netConnection_onDisconnect (); gå i stykker; case "NetGroup.Connect.Success": netGroup_onConnectSuccess (); gå i stykker; standard: break; }

    Vår nettgruppa er netStatusEvent lytteren vil ha lignende tester for å lytte til gruppespesifikke handlinger: innlegg totalt, peer (eller nabo i nettgruppa API) sluttet eller venstre, så vi vil ha denne enkle rutemetode (noen egenskaper vil det være implementert senere, like eller tilpasset NetGroupEvent klasse, vår VoNetGroupMessage, men du vil ta en titt på kodene mottatt, og du kan være oppmerksom på at vi allerede har en direkte telling av tiden koblet jevnaldrende ved å lese netGroup.neighborCount.
    privat funksjon netGroup_statusHandler (event: NetStatusEvent): void {switch (event.info.code) {case "NetGroup.Connect.Rejected": case "NetGroup.Connect.Failed": koble (); break; case "NetGroup.SendTo.Notify": break; case "NetGroup.Posting.Notify": messageReceived (ny VoNetGroupMessage (event.info.message)); break; case "NetGroup.Neighbor.Connect": dispatchEvent (ny NetGroupEvent (NetGroupEvent.NEIGHBOR_JOINED)); //Ingen pause her for å fortsette på samme segment enn frakoblings del case "NetGroup.Neighbor.Disconnect": neighborCount = netGroup.neighborCount; gå i stykker; case "NetGroup.LocalCoverage.Notify": case "NetGroup.MulticastStream.PublishNotify": case "NetGroup.MulticastStream.UnpublishNotify": case "NetGroup.Replication.Fetch.SendNotify": case "NetGroup.Replication.Fetch.Failed": case "NetGroup.Replication.Fetch.Result": case "NetGroup.Replication.Request": default: break; }}

    Vi har uthevet de viktigste søkeord og metoder for å bruke en NetGroup. I neste trinn vil vi formalisere dette ganske mye, skriver vår egen NetGroupManager klasse for å forenkle dette API for en grunnleggende meldingsutveksling bruk.



    Trinn 3: Bygge vår egen NetGroupManager Utilities

    Fordi vi ikke ønsker å bekymre deg for den indre arbeidet når det har blitt gjort, vil vi bygge et verktøy klasse å håndtere av nettverkskommunikasjon. Denne manageren vil bruke en NetGroupEvent å sende sin oppdatering, og en NetGroupMessage objekt å forene strukturen og få noen hjelpere. Dette vil gi oss en generisk leder, skrevet en gang, klar til å brukes i ethvert prosjekt.

    Først som en debug verktøy, vil vi lage en liten hjelper. I Flash Builder, opprette en ny Flex bibliotekprosjektet, name it LibHelpers
    , skape en ny "hjelpere" pakken og lim inn denne DemoHelper klasse i denne pakken:
    pakke hjelpere {public class DemoHelper {/** * Sentralisering av alle spor metoder, og prefiks dette med en liten * timestamp * /statisk offentlig funksjon log (msg: String): void {trace (tidsstempel + '\\ t' + msg); } /** * Nyttig funksjon for logging, formatering gjeldende tid i en enkel * å lese linje. *return En ':' avgrenset tid streng som 12: 34: 56: 789 * * /statisk offentlig funksjon får timestamp (): String {var nå: Date = new Date (); Var arTimestamp: Array = [now.getHours (), now.getMinutes (), now.getSeconds (), now.getMilliseconds ()]; tilbake arTimestamp.join (':'); }}}

    Det gir oss noe mer nyttig enn en enkel trace (). Ringe DemoHelper.put ('litt streng'); vil produksjonen meldingen, med et tidsstempel som prefiks. Det er også veldig praktisk å gruppere alle spor funksjoner i dette sentrale stedet å være i stand til enkelt å slå dem av.

    Viktig advarsel: Som flash.net.netGroup har blitt lagt i Flash Player 10.1, sørg for at du har oppdatert Flash Builder å jobbe med Flex 4.1 versjonen

    Nå kan du lage en ny. Flex bibliotekprosjektet heter LibNetGroup
    . Lag en nettgruppe 'pakke i dette prosjektet, hvor vi vil legge til filene våre.



    Trinn 4: En tilpasset NetGroupEvent å ekspedere Application-nivå Oppdateringer

    Først, la oss starte med våre egne arrangement. Vår manager vil bli brukt til å la prosjektet vet når gruppen er klar til å brukes (connectedToGroup hendelse), når vi er frakoblet, når en ny nabo har sluttet og når en melding er mottatt. Tydeligvis mange andre arrangementer kan legges til, men la oss holde det enkelt for nå, og du vil være i stand til å utvide det senere. Snarere enn å forlenge Flash er DynamicObject, velger jeg å bare ha to felt for lagring av tilleggsdata når hendelsen bærer detaljene i en mottatt melding.

    Så det ga oss en enkel hendelse som heter netgroup.NetGroupEvent:
    pakke netgroup {import flash.events.Event; public class NetGroupEvent strekker Hendelses {statisk offentlig konst innlegg: String = 'posting'; statisk offentlig konst CONNECTED_TO_GROUP: String = 'connectedToGroup'; statisk offentlig konst DISCONNECTED_FROM_GROUP: String = 'disconnectedFromGroup'; statisk offentlig konst NEIGHBOR_JOINED: String = 'neighborJoined'; offentlig Var melding: Object; offentlig Var emne: String; offentlig funksjon NetGroupEvent (type: String, bobler: Boolean = false, cancelable: Boolean = false) {super (type, bobler, cancelable); }}}



    Trinn 5: Vår egen Message Format til Bypass Fallgruver

    Neste enkelt trinn, vil vi sette opp en meldingsformat. En melding vil ha et emne, en avsender og en del data. Faget er nyttig for ruting mottatt melding i en reell søknad, vil dataene være en slags generisk objekt. Husk netGroup.post () metoden vi kort nevnt i trinn 2. Det tar et objekt som argument. Så vi vil ha noen serialisering metoder for å lage en VoNetMessage fra et objekt, og opprette et objekt fra en VoNetMessage eksempel. Dette serialisering metoden vil bli gjennomført ved en enkel getter metode, og vi vil legge til her litt salt.

    Husker du peer to peer automatisk håndtere ruting av meldingene. Hvis en node får en melding det allerede har videresendt, vil den vurdere dette budskapet like gammel, og vil ikke sende den på nytt. Men hva vil skje når vår søknad vil sende små enkle varsling som en enkelt streng 'endOfVote' for å varsle kunder avstemningen er avsluttet. Hvis vi starter en ny stemme, så stopper det, er dette veldig enkelt budskap vil bli sendt en gang til. Nøyaktig samme innhold. Men vi må sørge for at de jevnaldrende er klar over dette er enda en ny melding. Den enkleste måten å sørge for at dette er å legge litt salt i vårt budskap, når seriefunksjon den før du sender den. I dette eksempelet bruker jeg en enkel tilfeldig tall, men du vil kanskje legge til et tidsstempel, eller begynne å lage noen unike meldinger IDer. Du er sjefen. Det viktigste er å være klar over denne fallgruven. Da er du opp til å håndtere det slik du foretrekker.

    Her kommer vår netgroup.VoNetGroupMessage i sin enkleste form:
    pakke netgroup {/** * VoNetGroupMessage er litt helper som tvinger faget /data /avsender * felt før du sender en generisk objekt over luften . * * /Public class VoNetGroupMessage strekker Object {public Var emne: String; offentlig Var data: Object; offentlig Var avsender: String; //Avsenderens nearID offentlig funksjon får objekt (): Object {var o: Object = {}; o.subject = forbehold; o.data = data; o.sender = avsender; o.salt = Math.random () * 99999; //Vi legge litt salt for å sørge for at vi ikke sende samme melding 2 ganger tilbake o; } Offentlig funksjon VoNetGroupMessage (message: Object = null) {if (melding == null) message = {}; Emne = message.subject; data = message.data; avsender = message.sender; }}}

    For å sende en melding til gruppen, vil det være så enkelt som Instantiating en VoNetGroupMessage, fyller sine fag- og data egenskaper, deretter passerer sitt objekt getter i netGroup.post () -metoden. Når en melding vil bli mottatt fra gruppen, Instantiating det med objektet mottatt som konstruktør argument vil automatisk fylle eiendommene, klar til å bli lest, som dette:
    Var melding: VoNetGroupMessage = new VoNetGroupMessage (objectReceived)



    Trinn 6: Kabling alt sammen: den NetGroupManager Class

    Lederen vil være "black box" som vår søknad vil samhandle med å kommunisere med jevnaldrende. Vi ønsker ikke at våre forretningslogikk må ta vare på hvordan nettverket kommunikasjon foregår, vi ønsker bare å sende og motta meldinger. Så la oss starte med å definere den offentlige API vi ønsker for vår manager:

    Det vil sende hendelser om hva som skjer, derfor vil det strekker EventDispatcher

    Det vil være enkelt å sette opp til bruke vår egen rtmpServer verdi, developerKey hvis nødvendig, applicationName og groupname. Du trenger ikke å redigere klassen til å bruke det til et annet program.

  • En koble () metode for å koble til våre kolleger.
  • En frakobling () -metoden

    En Sendmessage ( ) metoden.

    La oss se på dette i detaljer



    NetGroupManager vil Publiseringsmenings Hendelser

    Det vil forlenge EventDispatcher, og vil sende de hendelsene vi har utarbeidet i NetGroupEvent. Vi hadde hendelses meta-tags for å gjøre deres bruk enklere: Twitter /** * Hendelse sendt hver gang du mottar en melding. * /[Hendelses (name = "oppslaget", type = "netgroup.NetGroupEvent")] /** * Hendelse sendt når netConnection og NetGroup tilkoblinger har vært * vellykket, og gruppen er klar til å brukes. * /[Hendelses (name = "connectedToGroup", type = "netgroup.NetGroupEvent")] /** * Hendelse sendt netgruppen forbindelsen er lukket. * /[Hendelses (name = "disconnectedFromGroup", type = "netgroup.NetGroupEvent")] /** * Hendelse sendt netgruppen forbindelsen er lukket. * /[Hendelses (name = "neighborJoined", type = "netgroup.NetGroupEvent")]

    Det vil også ha noen offentlige bindbare egenskaper til å ta en titt på gruppen staten. Vær forsiktig, har jeg latt dem som offentlige eiendommer for å gjøre koden mindre og lett bind, men disse skal ikke holdes eksternt redigeres i en virkelig verden prosjekt. Twitter /* --------------------------------------------- --------------------- * //* --- Nyttige offentlige eiendommer for forvaltning av konsernet --- * //* -------- -------------------------------------------------- -------- * /statisk offentlig konst STATE_DISCONNECTED: String = 'koblet'; statisk offentlig konst STATE_CONNECTING: String = 'koble'; statisk offentlig konst STATE_CONNECTED: String = "koblet"; private Var _neighborCount: int [bind (event = 'propertyChange')] /** neighborCount er en offentlig eksponering av netGroup.neighborCount eiendom * /offentlig funksjon får neighborCount (): int {return _neighborCount; } offentlig funksjon satt neighborCount (verdi: int): void {if (verdi == neighborCount) tilbake; _neighborCount = verdi; dispatchEvent (ny hendelse ('propertyChange'));} [bind] offentlig Var connectionState: String = STATE_DISCONNECTED [bind] offentlig Var tilkoblet: Boolean = false; [Bind] offentlig Var joinedGroup: Boolean = false;



    NetGroupManager vil være enkel å konfigurere

    La oss gi den enkelte offentlige eiendommer som argumenter: rtmfpServer, cirrusDevKey, applicationName og groupname. Dette bør høres kjent ut hvis du har lest de foregående trinnene. Twitter /* --------------------------------- --------------------------------- * //* --- Tilkoblings parametere --- * //* - -------------------------------------------------- --------------- * //** * Bruk en server rtmfp fungerer for lokale subnettet peer oppdagelse. * For bruken av internett med Cirrus server, noe som * rtmfp: //cirrus.adobe.com/"; vil være mer nyttig * /public Var _rtmfpServer: String =" rtmfp: "; /** * Hvis du bruker en Cirrus server, bør du legge til utvikleren nøkkelen her * /public Var _cirrusDevKey: String = ""; /** * applicationName er den felles delen av groupSpecifier navnet vi skal bruke * /public Var applicationName: String = "active.tutsplus. examples.netGroup /"; /** * groupname legges til applicationName å kunne håndtere flere * grupper for samme program enkelt * /public Var groupname:. String =" demoGroup ";



    NetGroupManager Vil være vår API for å sende meldinger til våre Peers ...

    Det vil ha noen metode: koble (), koble () og Sendmessage () Den kobler metoden er nesten allerede kjent, som alle de viktige ting i. det har blitt sett i forrige trinn. Frakoblingen metoden er rett og slett en wrapper av netConnection.close () -metoden.

    Sendmessage metoden vil bruke alt vi har forklart i VoNetGroupMessage struktur, det er derfor ingen overraskelse i gjennomføringen: det instantiates en VoNetGroupMessage objekt, fylle sine felt, så serial den ved hjelp av sitt objekt getter og bruke den for netGroup.post () -metoden
    offentlig funksjon Sendmessage. (med forbehold: String, messageContents: Object): void { (! tilkoblet) hvis kaste "Feil prøver å sende en melding uten å være tilkoblet"; //Opprett meldingen å sende, sette min ID på den og fylle den //med innholdet Var melding: VoNetGroupMessage = new VoNetGroupMessage (); message.subject = forbehold; message.data = messageContents; message.sender = netConnection.nearID; netGroup.post (message.object);}



    ... og NetGroupManager vil være vår sentrale sted å lese Melding mottatt Fra Peers

    Vi har allerede hatt en rask titt på de NetStatusEvent verdier. tidligere trinn; det eneste som mangler delen er messageReceived handler, kalt når en NetGroup.Posting.Notify status er mottatt. I NetStatusEvent lytteren, instantiate vi meldingen ved hjelp objektet vi får, så gi det til messageReceived metode:
    privat funksjon netGroup_statusHandler (event: NetStatusEvent): void {switch (event.info.code) {//{. ..} case "NetGroup.Posting.Notify": //messageReceived (ny VoNetGroupMessage (event.info.message)); gå i stykker; //Andre tilfeller ...

    Dette messageReceived behandleren vil sende meldingen. Virksomheten lag som kanskje har abonnert på denne hendelsen vil da håndtere de indre detaljer om meldingen, jobben av netGroupManager, som håndterer peer-tilkoblinger, sende og motta data, er gjort. Twitter /** * NetGroup tilbakeringing for en netGroup.post (..) kommando. * *param Melding Object, oppbygging av dette objektet blir definert i Sendmessage handler * *see #sendMessage () * /private funksjon messageReceived (message: VoNetGroupMessage): void {//Broadcast melding til noen suscribers Var hendelse: NetGroupEvent = new NetGroupEvent (NetGroupEvent.POSTING); event.message = message.data; event.subject = message.subject; dispatchEvent (event);}

    Som en milepæl, her kommer hele koden vår netgroup.NetGroupManager Klasse:
    pakke netgroup {import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; import flash.events.NetStatusEvent; import flash.net.GroupSpecifier; import flash.net.NetConnection; import flash.net.NetGroup; import flash.net.NetStream; import flash.sampler.getGetterInvocationCount; import flash.utils.getTimer; import helpers.DemoHelper; import mx.events.DynamicEvent; import org.osmf.net.NetConnectionCodes; import org.osmf.net.NetStreamCodes; /** * Hendelse sendt hver gang du mottar en melding. * /[Hendelses (name = "oppslaget", type = "netgroup.NetGroupEvent")] /** * Hendelse sendt når netConnection og NetGroup tilkoblinger har vært * vellykket, og gruppen er klar til å brukes. * /[Hendelses (name = "connectedToGroup", type = "netgroup.NetGroupEvent")] /** * Hendelse sendt netgruppen forbindelsen er lukket. * /[Hendelses (name = "disconnectedFromGroup", type = "netgroup.NetGroupEvent")] /** * Hendelse sendt netgruppen forbindelsen er lukket. * /[Hendelses (name = "neighborJoined", type = "netgroup.NetGroupEvent")] /** * * * /public class NetGroupManager strekker EventDispatcher {statisk offentlig konst STATE_DISCONNECTED: String = 'koblet'; statisk offentlig konst STATE_CONNECTING: String = 'koble'; statisk offentlig konst STATE_CONNECTED: String = "koblet"; /* ------------------------------------------------ ------------------ * //* --- Connection parametere --- * //* ---------------- -------------------------------------------------- * //** * Bruk en server rtmfp gjør arbeidet for lokale subnettet peer oppdagelse. * For bruken av internett med Cirrus server, noe som * rtmfp: //cirrus.adobe.com/"; vil være mer USEFULL * /public Var _rtmfpServer: String =" rtmfp: "; /** * Hvis du bruker en Cirrus server, bør du legge til utvikleren nøkkelen her * /public Var _cirrusDevKey: String = ""; /** * applicationName er den felles delen av groupSpecifier navnet vi skal bruke * /public Var applicationName: String = "active.tutsplus. examples.netGroup /"; /** * groupname legges til applicationName å kunne håndtere flere * grupper for samme program enkelt * /public Var groupname:. String =" demoGroup "; /* ------- -------------------------------------------------- --------- * //* --- Nyttig offentlige eiendommer for forvaltning av konsernet --- * //* -------------------- ---------------------------------------------- * /private Div _neighborCount: int; [Bind (event = 'propertyChange')] /** neighborCount er en offentlig eksponering av netGroup.neighborCount eiendom * /offentlig funksjon får neighborCount (): int {return _neighborCount; } Offentlig funksjon satt neighborCount (verdi: int): void {if (verdi == neighborCount) tilbake; _neighborCount = verdi; dispatchEvent (ny hendelse ('propertyChange')); } [Bind] offentlig Var connectionState: String = STATE_DISCONNECTED; [Bind] offentlig Var tilkoblet: Boolean = false; [Bind] offentlig Var joinedGroup: Boolean = false; beskyttet Var netConnection: NetConnection = null; beskyttet Var Netstream: Netstream = null; beskyttet Var nettgruppe: NetGroup = null; offentlig funksjon NetGroupManager (mål: IEventDispatcher = null) {super (target); } Offentlig funksjon koble (): void {_log ("Koble til '» + _rtmfpServer); connectionState = STATE_CONNECTING; netConnection = new NetConnection (); netConnection.addEventListener (NetStatusEvent.NET_STATUS, netConnection_netStatusHandler, falsk, 0, true); netConnection.connect (_rtmfpServer + _cirrusDevKey); } /** * Frakobling vil automatisk bli kalt når en nettgruppe tilkobling eller * en Netstream tilkoblingen vil bli avvist eller har mislyktes. * *see #netConnection_onDisconnect () * /Public funksjon frakobling (): void {if (netConnection) netConnection.close (); } Offentlig funksjon Sendmessage (subject: String, messageContents: Object): void {if (! Tilkoblet) kaste "Feil prøver å sende en melding uten å være tilkoblet"; 'G:01010103010c2c0e6163746976652e74757473706c75732e6578656d706c65732e6e657447726f75702f64656d6f47726f7570011b00070aee0000014e20' gå i stykker; gå i stykker; gå i stykker; gå i stykker; gå i stykker; gå i stykker; gå i stykker; gå i stykker; gå i stykker; import flash.events.Event; import flash.events.EventDispatcher; gå i stykker; gå i stykker; gå i stykker; gå i stykker; - >