Création d'un jeu avec Bonjour - Présentation du réseau

Bonjour est une technologie qui facilite la découverte de services. Malgré sa puissance et sa facilité d'utilisation, il ne fait pas l'objet d'une grande attention dans la communauté du cacao. Bonjour fonctionne très bien avec la bibliothèque CocoaAsyncSocket, une bibliothèque open source qui fournit une interface Objective-C permettant de travailler avec des sockets sur iOS et OS X. Dans cette série, je vais vous présenter Bonjour et la bibliothèque CocoaAsyncSocket en créant un jeu en réseau. En cours de route, je vous initierai au monde de la mise en réseau en abordant les protocoles TCP et UDP, ainsi que les sockets, les flux et les ports.!


introduction

Dans cette série, nous allons créer un jeu simple en réseau. Notre objectif principal sera l’aspect réseau du jeu. Je vais vous montrer comment connecter deux périphériques à l'aide de Bonjour et de la puissante bibliothèque CocoaAsyncSocket. Le jeu que nous allons créer permet à deux personnes d'un même réseau de s'affronter. Le jeu lui-même ne sera pas très avancé, alors ne vous attendez pas à un FPS riche en graphismes.

Dans cette série, je ne parlerai pas de l'infrastructure qui permet aux applications en réseau de communiquer entre elles. Au lieu de cela, je me concentrerai sur les protocoles et les technologies qui constituent le fondement des applications en réseau. Une compréhension de base des protocoles, sockets et flux TCP et UDP est inestimable pour tout développeur, en particulier pour ceux qui envisagent de créer des applications reposant sur la connectivité réseau. Même si vous n'avez pas l'intention d'utiliser Bonjour, je vous recommande vivement de lire le reste de cet article pour mieux comprendre la mise en réseau..

Dans cet article, je zoomerai sur plusieurs composants clés des applications en réseau. Cela vous aidera à comprendre le fonctionnement de Bonjour, ce qu’il est (et ce qu’il est) et facilitera beaucoup le travail avec la bibliothèque CocoaAsyncSocket..

N'oubliez pas que Bonjour n'est pas requis pour développer une application en réseau. La plupart des systèmes d'exploitation basés sur Unix, tels qu'iOS et OS X, utilisent des sockets BSD comme interface de programmation réseau fondamentale. Sur iOS et OS X, la bibliothèque de sockets BSD est facilement disponible. Travailler avec la bibliothèque de sockets BSD, cependant, n’est pas une mince affaire de cœur et nécessite une connaissance approfondie de la programmation des sockets et du langage C. Sur iOS et OS X, vous pouvez également utiliser le bas niveau CFNetwork cadre, qui est une extension directe aux sockets BSD. Apple a conçu le framework CFNetwork pour faciliter la mise en réseau en évitant les interactions directes avec les sockets BSD. L'un des avantages les plus importants de CFNetwork est sa prise en charge intégrée de l'intégration de la boucle d'exécution. CFNetwork fait partie du framework Core Foundation et est écrit en C.

Un nombre surprenant de développeurs iOS et OS X sont tellement habitués à la syntaxe Objective-C qu'ils craignent les bibliothèques et les frameworks écrits en C. Si vous êtes l'un de ces développeurs, le framework CFNetwork peut sembler décourageant. Cependant, il existe une solution à cela et son nom est CocoaAsyncSocket. La bibliothèque CocoaAsyncSocket facilite l'interaction avec les sockets et fournit également une interface élégante Objective-C. La version actuelle de la bibliothèque CocoaAsyncSocket s'intègre parfaitement à Grand Central Dispatch (GCD), ce qui facilite grandement la programmation asynchrone.


Commençons par examiner de plus près les bases du réseautage. Sans une bonne compréhension des sockets, des ports et des flux, même Bonjour et la bibliothèque CocoaAsyncSocket ne vous seront pas d'une grande utilité.!


Bases de la mise en réseau

Sous la capuche

La mise en réseau n'est pas facile et c'est quelque chose qui ne changera pas de sitôt. Même si l'infrastructure qui nous donne accès à Internet a radicalement changé au cours des dernières décennies, les technologies et les protocoles sous-jacents ont très peu changé. La raison en est que les services que nous utilisons quotidiennement s'appuient fortement sur les protocoles logiques sous-jacents et beaucoup moins sur l'infrastructure physique. Dans les années 90, la plupart d’entre nous naviguaient sur le Web par le biais d’une connexion par ligne commutée. De nos jours, la majorité des gens ont accès à une connexion haut débit rapide et, ces dernières années, une partie importante du Web a commencé à être consommée via des appareils mobiles. En d'autres termes, l'infrastructure a considérablement changé, mais les protocoles logiques nécessaires au routage du trafic et à l'interaction avec les applications n'ont pas changé de manière aussi spectaculaire..

Ne changez jamais une équipe gagnante

Une autre raison pour laquelle les technologies et les protocoles fondamentaux que nous utilisons pour transmettre des données sur Internet n'a pas beaucoup changé est qu'ils sont fiables, performants et robustes. Ces technologies et protocoles sont bien testés et se sont prouvés d'innombrables fois au cours des dernières décennies..


Sockets, Streams et Ports

En tant que développeur, vous avez probablement entendu parler de sockets, de ports, d’adresses, etc. Si vous n'êtes pas familier avec ces termes, vous êtes pris au piège car je vous présenterai les merveilles des sockets, des ports, des flux et des protocoles. Pour acquérir une compréhension de base de la mise en réseau, il est essentiel que vous connaissiez la base de la mise en réseau, y compris les sockets et ses amis..

Sockets locaux et distants

Une connexion réseau fonctionne à travers des sockets. Un socket est l'une des extrémités d'un canal de communication entre deux processus souhaitant se parler. Comme vous l'avez peut-être deviné, une connexion réseau (ou un canal de communication interprocessus) possède deux sockets, un pour chaque extrémité du canal. Une connexion réseau est établie par une prise établissant une connexion avec une autre prise, la prise d'écoute, qui écoute les connexions entrantes..

La différence entre une prise locale et une prise distante est simplement sémantique. Du point de vue d’une prise, la prise est la prise locale et la prise à laquelle elle est connectée est la prise distante. Ça a du sens. Droite?

Lorsqu'un socket est utilisé pour envoyer et recevoir des données, un flux peut lire des données ou écrire des données. Cela signifie que dans la plupart des cas, chaque socket a deux flux, un pour la lecture et un pour l’écriture. Même si les flux constituent un aspect important de la programmation de socket, nous ne travaillerons pas directement avec les flux, car ceux-ci sont gérés pour nous par la bibliothèque CocoaAsyncSocket..

Établissement d'une connexion réseau

Chaque prise a un adresse qui consiste en Adresse de l'hôte et un numéro de port. Les deux parties sont essentielles pour établir une connexion entre deux prises. Pour rester simple, l'adresse de l'hôte est généralement l'adresse IP (Internet Protocol) de la machine, tandis que le numéro de port identifie de manière unique le socket de la machine. Comparez ce concept avec un complexe d'appartements. Le bâtiment a une adresse pour que les gens sachent où le trouver. Chaque appartement dans l'immeuble a un numéro unique afin que les visiteurs du complexe puissent trouver l'appartement qu'ils recherchent..

Protocoles de transmission

La transmission de données sur Internet est un processus complexe qui a abouti à la création de deux protocoles robustes permettant d'envoyer et de recevoir des données de manière uniforme: TCP (Transmission Control Protocol) et UDP (User Datagram Protocol). Les deux protocoles sont protocoles de couche de transport et une partie de la protocole Internet Suite (IP).

Je suis sûr que TCP et UDP vous interpellent. Il existe plusieurs différences essentielles entre les deux protocoles et il est important de comprendre ces différences. Dans cette série, nous allons nous concentrer sur le protocole TCP. Une connexion TCP gère un flux de données d'un point de terminaison à un autre.

Fiabilité du réseau

Les principales différences entre TCP et UDP sont la vitesse et comment ils font face à fiabilité du réseau. Si vous voulez vous assurer que ce qui est envoyé via une extrémité de la connexion sort à l'autre extrémité, alors TCP est votre ami. Le protocole TCP est plus lent que le protocole UDP, mais il a de bonnes raisons d'être plus lent. Sans entrer trop dans les détails, il est important de savoir que TCP établit et met fin à une connexion avec une liaison pour identifier les deux extrémités de la connexion. Il s'assure également que chaque paquet envoyé via le canal arrive à l'autre extrémité. De plus, TCP s'assure que l'ordre des paquets est respecté.

Une des raisons pour laquelle UDP est plus rapide que TCP est qu’il n’exige pas de prise de contact pour établir et mettre fin à une connexion. De plus, le protocole UDP ne s’inquiète pas de l’arrivée d’un paquet ni de l’ordre dans lequel les paquets arrivent. Si un paquet est abandonné en cours de route, le protocole UDP n'essaie pas de le renvoyer car il n'est même pas au courant de la perte du paquet. La principale préoccupation d'UDP est que les données soient envoyées par le canal de communication aussi rapidement que possible..

Je suis sûr que vous commencez à voir que TCP et UDP sont des protocoles très différents et que chaque protocole a un objectif différent. UDP, par exemple, est idéal pour le streaming audio et vidéo en direct. La vitesse est essentielle dans ces situations. Peu importe si un paquet est déposé en cours de route. Si un paquet déposé était renvoyé, il arriverait en retard et, pour la diffusion en direct, il ne serait plus pertinent. Les jeux multijoueurs en ligne bénéficient également du protocole UDP. La vitesse du protocole UDP est plus importante que sa fiabilité. Les paquets qui arrivent trop tard ne sont plus pertinents et c'est l'idée fondamentale de UDP - la rapidité par rapport à la fiabilité.

TCP, par contre, est une question de fiabilité. Il est utilisé pour le courrier électronique et la navigation sur le Web. Il est un peu plus lent, mais il fera de son mieux pour vous assurer de recevoir ce que vous avez demandé. Le protocole TCP est très robuste et prend en charge le renvoi de paquets rejetés. Il respecte également l’ordre dans lequel les paquets sont envoyés. Même si nous utiliserons le protocole TCP dans cette série, sachez que la bibliothèque CocoaAsyncSocket prend également en charge le protocole UDP..

Client et serveur

En termes de mise en réseau, vous devez comprendre un autre concept: le modèle client-serveur. Dans chaque communication, il y a un client et un serveur. Comparez ce modèle avec deux personnes effectuant un appel téléphonique. Steven veut téléphoner à Lucy. Il y a trois conditions fondamentales pour que cela fonctionne.

  1. La première exigence est que Steven connaisse Lucy et qu'il connaisse le numéro de téléphone de Lucy. Il en va de même pour un client essayant de se connecter à un serveur. Le client doit connaître l'existence du serveur et connaître l'adresse du serveur..
  2. L'inverse, cependant, n'est pas vrai. Lucy n'a pas besoin de savoir quoi que ce soit à propos de Steven pour que Steven appelle Lucy. En d'autres termes, un serveur n'a pas besoin de connaître l'existence d'un client pour que le client se connecte au serveur..
  3. Une fois que la connexion est établie, Steven peut parler à Lucy et Lucy peut parler à Steven. Lorsqu'un client est connecté à un serveur, le client peut envoyer des données au serveur et le serveur peut envoyer des données au client..

Ce concept de client et de serveur deviendra important lorsque nous examinerons le fonctionnement de Bonjour dans le prochain article de cette série. Terminons ce tutoriel en jetant un coup d’œil à Bonjour..


Où est la place de Bonjour??

Qu'est-ce que Bonjour et comment s'inscrit-il dans notre histoire? Bonjour est une technologie créée par Apple et basée sur Zeroconf. Son objectif principal est de faciliter la découverte des services. Il est fort probable que vous ayez utilisé Bonjour plusieurs fois sans le savoir. Avez-vous déjà utilisé une imprimante sur votre réseau local? Cela ne vous a-t-il pas semblé qu'il ne fallait pratiquement aucun effort pour utiliser l'imprimante, même si elle n'était pas connectée physiquement à votre ordinateur? L'application iOS à distance d'Apple utilise également Bonjour, de même que de nombreuses autres applications iOS et OS X.

Même si Bonjour est une technologie géniale, gardez à l’esprit qu’elle ne se charge pas d’envoyer ou de recevoir des données. Ce que Bonjour fait très bien, c’est la publication et la découverte de services situés sur le même réseau local. Dans le prochain article, nous examinerons de plus près les API de Bonjour et commencerons à créer le modèle client-serveur décrit dans cet article..


Conclusion

Avec ce didacticiel d’introduction, vous devriez avoir une compréhension de base de la mise en réseau, des divers composants impliqués et du rôle de chaque composant. Dans les parties restantes de cette série, nous allons revenir sur l'utilisation de certains de ces composants, il est donc essentiel que vous compreniez ce que nous avons couvert dans cet article. Dans le prochain article, je parlerai davantage du modèle client-serveur en vous expliquant comment connecter deux périphériques à l'aide de Bonjour et de la bibliothèque CocoaAsyncSocket..