Creazione di un gioco con Bonjour - Panoramica della rete

Bonjour è una tecnologia che facilita la scoperta dei servizi. Nonostante la sua potenza e facilità d'uso, non riceve molta attenzione nella comunità di Cocoa. Bonjour funziona molto bene con la libreria CocoaAsyncSocket, una libreria open source che fornisce un'interfaccia Objective-C per lavorare con i socket su iOS e OS X. In questa serie, ti presenterò Bonjour e la libreria CocoaAsyncSocket creando un semplice, gioco in rete. Lungo la strada, ti avvierò nel mondo del networking discutendo i protocolli TCP e UDP così come i socket, i flussi e le porte!


introduzione

In questa serie, creeremo un semplice gioco in rete. Il nostro obiettivo primario sarà l'aspetto del gioco in rete. Ti mostrerò come connettere due dispositivi usando Bonjour e la potente libreria CocoaAsyncSocket. Il gioco che creeremo permetterà a due persone della stessa rete di sfidarsi a vicenda. Il gioco in sé non sarà molto avanzato, quindi non aspettarti un FPS graficamente ricco.

In questa serie, non parlerò dell'infrastruttura che consente alle applicazioni in rete di comunicare tra loro. Invece, mi concentrerò sui protocolli e sulle tecnologie che costituiscono le fondamenta delle applicazioni in rete. Una conoscenza di base dei protocolli TCP, UDP e socket è inestimabile per qualsiasi sviluppatore, in particolare per quelli che intendono creare applicazioni basate sulla connettività di rete. Anche se non intendi utilizzare Bonjour, ti consiglio vivamente di leggere il resto di questo articolo per comprendere meglio il networking.

In questo articolo, eseguirò uno zoom su diversi componenti chiave delle applicazioni in rete. Ti aiuterà a capire come funziona Bonjour, cos'è Bonjour (e non lo è) e renderà molto più semplice il lavoro con la libreria CocoaAsyncSocket.

Tieni presente che Bonjour non è tenuto a sviluppare un'applicazione in rete. La maggior parte dei sistemi operativi basati su Unix, come iOS e OS X, utilizzano i socket BSD come interfaccia di programmazione di rete fondamentale. Su iOS e OS X, la libreria Socket BSD è facilmente disponibile. Lavorare con la libreria BSD Socket, tuttavia, non è per i deboli di cuore e richiede una conoscenza approfondita della programmazione di socket e del linguaggio C. Su iOS e OS X, puoi anche utilizzare il livello basso CFNetwork framework, che è un'estensione diretta ai socket BSD. Apple ha progettato il framework CFNetwork per semplificare il networking evitando l'interazione diretta con i socket BSD. Uno dei vantaggi più importanti di CFNetwork è il supporto integrato per l'integrazione del ciclo di esecuzione. CFNetwork fa parte del framework Core Foundation e scritto in C.

Un numero sorprendente di sviluppatori iOS e OS X sono così abituati alla sintassi Objective-C da evadere dalle librerie e dai framework scritti in C. Se sei uno di quegli sviluppatori, allora il framework CFNetwork potrebbe sembrare scoraggiante. Tuttavia, esiste una soluzione per questo e il suo nome è CocoaAsyncSocket. La libreria CocoaAsyncSocket semplifica l'interazione con i socket e fornisce anche un'interfaccia Objective-C elegante. La versione corrente della libreria CocoaAsyncSocket si integra perfettamente con Grand Central Dispatch (GCD) che rende la programmazione asincrona un gioco da ragazzi.


Iniziamo dando uno sguardo più da vicino alle basi del networking. Senza una buona conoscenza di socket, porte e flussi, anche Bonjour e la libreria CocoaAsyncSocket non saranno di grande utilità per te!


Nozioni di base sulla rete

Sotto il cappuccio

La rete non è facile e questo è qualcosa che non cambierà presto. Anche se l'infrastruttura che ci dà accesso a Internet è cambiata radicalmente nel corso degli ultimi decenni, le tecnologie e i protocolli sottostanti sono cambiati molto poco. Il motivo è che i servizi che utilizziamo quotidianamente dipendono fortemente dai protocolli logici sottostanti e molto meno dall'infrastruttura fisica. Negli anni novanta, la maggior parte di noi navigava sul web attraverso una connessione dial-up. Oggigiorno, la maggior parte delle persone ha accesso a una connessione a banda larga veloce e negli ultimi anni una parte significativa del web ha iniziato a essere consumata attraverso i dispositivi mobili. In altre parole, l'infrastruttura è cambiata radicalmente, ma i protocolli logici necessari per instradare il traffico e interagire con le applicazioni non sono cambiati in modo drammatico.

Non cambiare mai una squadra vincente

Un altro motivo per cui le tecnologie e i protocolli fondamentali che utilizziamo per trasmettere dati su Internet non sono cambiati molto è perché si sono dimostrati affidabili, performanti e robusti. Tali tecnologie e protocolli sono ben testati e si sono dimostrati innumerevoli volte negli ultimi decenni.


Prese, stream e porte

Come sviluppatore, probabilmente hai sentito parlare di socket, porte, indirizzi e simili. Se non si ha familiarità con questi termini, si è pronti per un trattamento in quanto vi introdurrò alle meraviglie di socket, porte, flussi e protocolli. Per avere una conoscenza di base del networking, è fondamentale che tu conosca il fondamento della rete e che includa i socket e i suoi amici.

Socket locali e remoti

Una connessione di rete funziona tramite socket. Un socket è un'estremità di un canale di comunicazione tra due processi che vogliono parlare tra loro. Come avrai intuito, una connessione di rete (o un canale di comunicazione tra processi) ha due socket, uno per ogni estremità del canale. Una connessione di rete viene stabilita da un socket che effettua una connessione con un altro socket, il socket di ascolto, che sta ascoltando le connessioni in entrata.

La differenza tra un socket locale e remoto è semplicemente semantica. Dal punto di vista di un socket, il socket è il socket locale e il socket a cui è connesso è il socket remoto. Ciò ha senso. Destra?

Mentre un socket viene utilizzato per inviare e ricevere dati, uno stream può leggere dati o scrivere dati. Ciò significa che nella maggior parte dei casi, ogni socket ha due stream, uno per la lettura e uno per la scrittura. Anche se i flussi sono un aspetto importante della programmazione dei socket, non lavoreremo direttamente con gli stream poiché gli stream sono gestiti per noi dalla libreria CocoaAsyncSocket.

Stabilire una connessione di rete

Ogni presa ha un indirizzo quello consiste del indirizzo dell'host e a numero di porta. Entrambe le parti sono essenziali per stabilire una connessione tra due prese. Per semplificare le cose, l'indirizzo host è solitamente l'indirizzo IP (Internet Protocol) della macchina, mentre il numero di porta identifica in modo univoco il socket sulla macchina. Confronta questo concetto con un complesso di appartamenti. L'edificio ha un indirizzo così le persone sanno dove trovarlo. Ogni appartamento nell'edificio ha un numero unico in modo che i visitatori del complesso possano trovare l'appartamento che stanno cercando.

Protocolli di trasmissione

La trasmissione di dati su Internet è un processo complesso e ha portato alla creazione di due protocolli robusti per l'invio e la ricezione uniforme dei dati: TCP (Transmission Control Protocol) e UDP (User Datagram Protocol). Entrambi i protocolli sono protocolli del livello di trasporto e parte del Protocollo Internet (IP) suite.

Sono sicuro che TCP e UDP suonano un campanello con la maggior parte di voi. Esistono diverse differenze chiave tra entrambi i protocolli ed è importante comprendere tali differenze. In questa serie, ci concentreremo sul protocollo TCP. Una connessione TCP gestisce un flusso di dati da un endpoint a un altro.

Affidabilità di rete

Le principali differenze tra TCP e UDP sono velocità e come si affrontano affidabilità della rete. Se vuoi assicurarti che ciò che viene inviato attraverso una estremità della connessione venga visualizzato dall'altra parte, allora TCP è tuo amico. TCP è più lento di UDP, ma ha una buona ragione per essere più lento. Senza entrare troppo nel dettaglio, è importante sapere che TCP stabilisce e termina una connessione con una stretta di mano per identificare entrambe le estremità della connessione. Inoltre si assicura che ogni pacchetto inviato attraverso il canale arrivi dall'altra parte. Inoltre, TCP assicura che l'ordine dei pacchetti sia rispettato.

Uno dei motivi per cui UDP è più veloce del TCP è perché non richiede un handshake per stabilire e terminare una connessione. Inoltre, il protocollo UDP non si preoccupa se arriva un pacchetto e inoltre non si preoccupa dell'ordine in cui arrivano i pacchetti. Se un pacchetto viene eliminato lungo il percorso, il protocollo UDP non tenta di inviarlo nuovamente poiché non è nemmeno a conoscenza del fatto che il pacchetto viene eliminato. La preoccupazione principale di UDP è che i dati vengano inviati attraverso il canale di comunicazione il più velocemente possibile.

Sono sicuro che stai iniziando a vedere che TCP e UDP sono protocolli molto diversi e che ogni protocollo ha uno scopo diverso. L'UDP, ad esempio, è l'ideale per lo streaming di audio e video dal vivo. La velocità è essenziale in queste situazioni. Non importa se un pacchetto viene rilasciato lungo il percorso. Se un pacchetto scartato fosse rinviato, sarebbe arrivato in ritardo e per lo streaming live non sarebbe più rilevante. Anche i giochi multiplayer online beneficiano di UDP. La velocità di UDP è più importante della sua affidabilità. I pacchetti che arrivano troppo tardi non sono più rilevanti e questa è l'idea fondamentale alla base di UDP: la velocità rispetto all'affidabilità.

TCP, d'altra parte, è tutto basato sull'affidabilità. Viene utilizzato per la posta elettronica e la navigazione sul Web. È un po 'più lento, ma farà del suo meglio per assicurarti di ricevere ciò che hai chiesto. Il protocollo TCP è molto robusto e supporta il reinvio dei pacchetti scartati e rispetta anche l'ordine con cui i pacchetti vengono inviati. Anche se utilizzeremo il protocollo TCP in questa serie, tieni presente che la libreria CocoaAsyncSocket supporta anche il protocollo UDP.

Client e Server

In termini di networking, c'è un altro concetto che devi capire: il modello client-server. In ogni comunicazione, c'è un client e un server. Confronta questo modello con due persone che fanno una telefonata. Steven vuole fare una telefonata a Lucy. Ci sono tre requisiti fondamentali per farlo funzionare.

  1. Il primo requisito è che Steven conosca Lucy e che abbia bisogno di conoscere il numero di telefono di Lucy. Lo stesso vale per un client che tenta di connettersi a un server. Il cliente deve sapere dell'esistenza del server e deve conoscere l'indirizzo del server.
  2. Il contrario, tuttavia, non è vero. Lucy non ha bisogno di sapere nulla su Steven per Steven per chiamare Lucy. In altre parole, un server non ha bisogno di sapere dell'esistenza di un client per il client da connettere al server.
  3. Una volta stabilita la connessione, Steven può parlare con Lucy e Lucy può parlare con Steven. Quando un client è connesso a un server, il client può inviare dati al server e il server può inviare dati al client.

Questo concetto di client e server diventerà importante quando guarderemo a Bonjour in pratica nel prossimo articolo di questa serie. Concludiamo questo tutorial dando una breve occhiata a Bonjour.


Dove si inserisce Bonjour?

Cos'è Bonjour e come si inserisce nella nostra storia? Bonjour è una tecnologia creata da Apple e basata su Zeroconf. Il suo obiettivo principale è rendere facile la scoperta dei servizi. È probabile che tu abbia usato Bonjour numerose volte senza nemmeno saperlo. Hai mai usato una stampante sulla tua rete locale? Non ti ha colpito il fatto che non ci sia quasi nessuno sforzo per usare la stampante anche se non era fisicamente connessa al tuo computer? Anche l'applicazione Apple Remote per Apple fa uso di Bonjour, così come molte altre applicazioni iOS e OS X..

Anche se Bonjour è una grande tecnologia, tieni presente che non si cura di inviare o ricevere dati. Quello che Bonjour fa molto bene è pubblicare e scoprire servizi che si trovano sulla stessa rete locale. Nel prossimo articolo, daremo un'occhiata più da vicino alle API di Bonjour e inizieremo a costruire il modello client-server che abbiamo discusso in questo articolo.


Conclusione

Con questo tutorial introduttivo, dovresti avere una conoscenza di base del networking, dei vari componenti coinvolti e del ruolo di ciascun componente. Nelle restanti parti di questa serie, rivisiteremo e useremo alcuni di questi componenti, quindi è fondamentale che tu capisca cosa abbiamo trattato in questo articolo. Nel prossimo articolo parlerò più del modello client-server mostrandovi come collegare due dispositivi usando Bonjour e la libreria CocoaAsyncSocket.