Opprette et spill med Bonjour - Nettverksoversikt

Bonjour er en teknologi som gjør oppdagelsen av tjenester veldig enkelt. Til tross for sin kraft og brukervennlighet, får den ikke mye oppmerksomhet i Cocoa-samfunnet. Bonjour fungerer veldig bra med CocoaAsyncSocket biblioteket, et åpen kildebibliotek som gir et objektiv-C-grensesnitt for å arbeide med stikkontakter på IOS og OS X. I denne serien vil jeg introdusere deg til Bonjour og CocoaAsyncSocket-biblioteket ved å lage en enkel, nettverksspill. Underveis vil jeg starte deg inn i nettverksverdenen ved å diskutere TCP- og UDP-protokollene, samt stikkontakter, strømmer og porter!


Introduksjon

I denne serien skal vi lage et enkelt nettverksspill. Vårt primære fokus vil være nettverksaspektet av spillet. Jeg vil vise deg hvordan du kobler to enheter med Bonjour og det kraftige CocoaAsyncSocket biblioteket. Spillet som vi skal opprette, tillater to personer på samme nettverk å utfordre hverandre. Spillet selv vil ikke være veldig avansert, så forvent ikke en grafisk rik FPS.

I denne serien snakker jeg ikke om infrastrukturen som gjør det mulig for nettverksapplikasjoner å kommunisere med hverandre. I stedet vil jeg fokusere på protokoller og teknologier som danner grunnlaget for nettverksapplikasjoner. En grunnleggende forståelse av TCP og UDP protokollene, stikkontakter og strømmer er uvurderlig for enhver utvikler, spesielt de som planlegger å lage applikasjoner som er avhengige av nettverkstilkobling. Selv om du ikke har tenkt å bruke Bonjour, anbefaler jeg sterkt å lese resten av denne artikkelen for å få bedre forståelse av nettverk.

I denne artikkelen vil jeg zoome inn på flere viktige komponenter i nettverksapplikasjoner. Det vil hjelpe deg å forstå hvordan Bonjour fungerer, hva Bonjour er (og ikke er), og det vil også gjøre arbeidet med CocoaAsyncSocket-biblioteket mye lettere.

Husk at Bonjour ikke er pålagt å utvikle en nettverksapplikasjon. De fleste Unix-baserte operativsystemer, for eksempel iOS og OS X, bruker BSD-stikkontakter som deres grunnleggende nettverksprogrammeringsgrensesnitt. På IOS og OS X er BSD Socket-biblioteket lett tilgjengelig. Arbeid med BSD Socket-biblioteket er imidlertid ikke for svak i hjertet og krever en grundig kunnskap om sokkelprogrammering og C-språket. På IOS og OS X kan du også bruke lavnivået CFNetwork rammeverk, som er en direkte utvidelse til BSD-stikkontakter. Apple utviklet CFNetwork-rammeverket for å gjøre nettverket lettere ved å unngå direkte samhandling med BSD-stikkontakter. En av de viktigste fordelene med CFNetwork er den innebygde støtten til run-loop integrering. CFNetwork er en del av Core Foundation Framework og er skrevet i C.

Et overraskende antall iOS- og OS X-utviklere er så vant til objektiv-C-syntaksen at de viker bort fra biblioteker og rammer som er skrevet i C. Hvis du er en av disse utviklerne, kan CFNetwork-rammen virke skremmende. Det er imidlertid en løsning for dette, og navnet heter CocoaAsyncSocket. CocoaAsyncSocket-biblioteket gjør det lettere å samhandle med kontakter, og det gir også et elegant objektiv-C-grensesnitt. Den nåværende versjonen av CocoaAsyncSocket-biblioteket integrerer pent med Grand Central Dispatch (GCD) som gjør asynkron programmering til en bris.


La oss starte med å se nærmere på det grunnleggende om nettverk. Uten en god forståelse av stikkontakter, porter og strømmer, til og med Bonjour og CocoaAsyncSocket-biblioteket, vil ikke være til stor nytte for deg!


Grunnleggende nettverk

Under panseret

Nettverk er ikke lett, og dette er noe som ikke endres når som helst snart. Selv om infrastrukturen som gir oss tilgang til Internett, har endret seg dramatisk i løpet av de siste tiårene, har de underliggende teknologiene og protokollene endret seg svært lite. Årsaken er at tjenestene vi bruker daglig stole tungt på de underliggende logiske protokollene og mye mindre på den fysiske infrastrukturen. På nittitallet så de fleste av oss på nettet via en oppringt tilkobling. I dag har flertallet tilgang til en rask bredbåndsforbindelse, og i de siste årene har en betydelig del av nettet begynt å bli konsumert gjennom mobile enheter. Med andre ord har infrastrukturen endret seg dramatisk, men de logiske protokollene som er nødvendige for å dirigere trafikk og samhandle med applikasjoner, har ikke endret seg så dramatisk.

Aldri endre et vinnende lag

En annen grunn til at de grunnleggende teknologiene og protokollene som vi bruker til å overføre data på Internett, ikke har endret seg, er fordi de har vist seg pålitelige, performante og robuste. Disse teknologiene og protokollene er godt testet, og de har bevist seg utallige ganger de siste tiårene.


Sockets, Streams, and Ports

Som utvikler har du sikkert hørt om stikkontakter, porter, adresser og lignende. Hvis du ikke er kjent med disse vilkårene, så er du inne for en godbit som jeg vil introdusere deg til underverkene i stikkontakter, porter, strømmer og protokoller. For å få en grunnleggende forståelse av nettverk, er det viktig at du kjenner baskene til nettverk og det inkluderer stikkontakter og dets venner.

Lokale og eksterne stikkontakter

En nettverksforbindelse opererer via stikkontakter. En stikkontakt er en ende av en kommunikasjonskanal mellom to prosesser som vil snakke med hverandre. Som du kanskje har gjettet, har en nettverkstilkobling (eller mellomprosesskommunikasjonskanal) to kontakter, en for hver ende av kanalen. En nettverksforbindelse er etablert med en stikkontakt som kobler til en annen stikkontakt, lytteuttaket, som lytter etter innkommende tilkoblinger.

Forskjellen mellom en lokal og ekstern kontakt er bare semantisk. Fra et stikkontakt er stikkontakten den lokale kontakten og kontakten den er tilkoblet, er den eksterne kontakten. Det er fornuftig. Ikke sant?

Mens en stikkontakt brukes til å sende og motta data, kan en strøm enten lese data eller skrive data. Dette betyr at hatten i de fleste tilfeller har hver sokkel to strømmer, en for lesing og en for skriving. Selv om strømmer er et viktig aspekt ved sokkelprogrammering, vil vi ikke arbeide med strømmer direkte som strømmer forvaltes av CocoaAsyncSocket biblioteket.

Etablering av en nettverkstilkobling

Hver kontakt har en adresse som består av vertsadresse og a portnummer. Begge delene er avgjørende for å etablere en forbindelse mellom to stikkontakter. For å holde ting enkelt, er vertsadressen vanligvis IP-adressen (Internet Protocol) til maskinen mens portnummeret identifiserer stikkontakten på maskinen. Sammenlign dette konseptet med et leilighetskompleks. Bygningen har en adresse slik at folk vet hvor de skal finne den. Hver leilighet i bygningen har et unikt nummer, slik at besøkende på komplekset kan finne leiligheten de leter etter.

Overføringsprotokoller

Overføring av data over Internett er en kompleks prosess, og det har resultert i opprettelse av to robuste protokoller for jevnt sending og mottak av data: TCP (Transmission Control Protocol) og UDP (User Datagram Protocol). Begge protokollene er transportlag protokoller og en del av Internett protokoll (IP) suite.

Jeg er sikker på at TCP og UDP ringer en klokke med de fleste av dere. Det er flere viktige forskjeller mellom begge protokollene, og det er viktig å forstå disse forskjellene. I denne serien vil vi fokusere på TCP-protokollen. En TCP-tilkobling styrer en datastrøm fra ett endepunkt til et annet.

Nettverkspålitelighet

Hovedforskjellene mellom TCP anad UDP er hastighet og hvordan de takler seg nettverkssikkerhet. Hvis du vil sørge for at det som sendes gjennom den ene enden av forbindelsen kommer ut i den andre enden, så er TCP din venn. TCP er tregere enn UDP, men det har en god grunn til å være langsommere. Uten å gå for mye i detalj, er det viktig å vite at TCP etablerer og avslutter en forbindelse med et håndtrykk for å identifisere begge ender av forbindelsen. Det sørger også for at hver pakke som sendes via kanalen, kommer i den andre enden. I tillegg sikrer TCP at rekkefølgen av pakkene respekteres.

En av grunnene til at UDP er raskere enn TCP, er fordi det ikke krever et håndtrykk når du etablerer og avslutter en tilkobling. I tillegg bryr UDP-protokollen seg ikke om en pakke kommer, og det bryr seg heller ikke om hvilken rekkefølge pakker ankommer. Hvis en pakke blir tapt underveis, forsøker UDP-protokollen ikke å sende den på nytt, da den ikke engang er klar over at pakken blir tapt. Den største bekymringen for UDP er at data sendes via kommunikasjonskanalen så fort som mulig.

Jeg er sikker på at du begynner å se at TCP og UDP er svært forskjellige protokoller, og at hver protokoll tjener en annen hensikt. UDP, for eksempel, er ideelt for streaming av direkte lyd og video. Hastighet er viktig i disse situasjonene. Det spiller ingen rolle om en pakke blir tapt underveis. Hvis en tapt pakke ville være resent, ville det komme sent, og for live streaming ville det ikke lenger være relevant. Online multiplayer-spill har også nytte av UDP. Hastigheten til UDP er viktigere enn dens pålitelighet. Pakker som kommer for sent er ikke lenger relevante, og det er grunnleggende ideen bak UDP-hastighet over pålitelighet.

TCP, derimot, handler om pålitelighet. Den brukes til e-post og surfing på nettet. Det er litt tregere, men det vil gjøre sitt aller beste for å sikre at du mottar det du ba om. TCP-protokollen er svært robust og støtter å sende om igjen pakkede pakker, og det respekterer også rekkefølgen der pakkene sendes. Selv om vi skal bruke TCP-protokollen i denne serien, må du huske at biblioteket CocoaAsyncSocket også støtter UDP-protokollen.

Klient og server

Når det gjelder nettverk, er det ett konsept du trenger å forstå: klient-servermodellen. I hver kommunikasjon er det en klient og en server. Sammenlign denne modellen med to personer som ringer. Steven vil ringe til Lucy. Det er tre grunnleggende krav for at dette skal fungere.

  1. Det første kravet er at Steven vet om Lucy, og han trenger å kjenne Lucys telefonnummer. Det samme gjelder for en klient som prøver å koble seg til en server. Klienten trenger å vite om eksistensen av serveren og den trenger å kjenne til serverens adresse.
  2. Det motsatte er imidlertid ikke sant. Lucy trenger ikke å vite noe om Steven for Steven å ringe til Lucy. Med andre ord, en server trenger ikke å vite om eksistensen av en klient for klienten å koble til serveren.
  3. Når forbindelsen er etablert, kan Steven snakke med Lucy og Lucy kan snakke med Steven. Når en klient er koblet til en server, kan klienten sende data til serveren og serveren kan sende data til klienten.

Dette konseptet med en klient og en server vil bli viktig når vi ser på Bonjour i praksis i neste artikkel i denne serien. La oss konkludere med denne veiledningen ved å ta en kort titt på Bonjour.


Hvor passer Bonjour inn??

Hva er Bonjour, og hvordan passer det inn i vår historie? Bonjour er en teknologi laget av Apple og basert på Zeroconf. Dens primære mål er å gjøre oppdagelsen av tjenester enkelt. Sjansen er at du har brukt Bonjour mange ganger uten å vite det. Har du noen gang brukt en skriver på ditt lokale nettverk? Fikk det ikke deg for at det tok nesten ingen innsats å bruke skriveren, selv om den ikke var fysisk koblet til datamaskinen din? Apples Remote IOS-program benytter også Bonjour, og det gjør også mange andre iOS- og OS X-programmer.

Selv om Bonjour er en god teknologi, vær oppmerksom på at den ikke tar vare på å sende eller motta data. Hva Bonjour gjør veldig bra, er å publisere og oppdage tjenester som er på samme lokale nettverk. I neste artikkel vil vi se nærmere på Bonjour APIs, og vi vil begynne å bygge klient-server modellen som vi diskuterte i denne artikkelen.


Konklusjon

Med denne innledende opplæringen bør du ha en grunnleggende forståelse av nettverk, de involverte komponentene og rollen til hver komponent. I de resterende delene av denne serien vil vi se på og bruke noen av disse komponentene, så det er viktig at du forstår hva vi dekket i denne artikkelen. I neste artikkel vil jeg snakke mer om klient-servermodellen ved å vise deg hvordan du kobler to enheter med Bonjour og CocoaAsyncSocket-biblioteket.