wiki:InsiaProgPerlProjetBomberStep3

Version 3 (modified by Vincent Caron, 14 years ago) (diff)

--

Projet Perl Bomberman

Projet Perl - Bomberman réseau

Réalisation (3) - Protocole réseau

Principe du jeu en réseau

Quand un jeu fait intervenir plusieurs participant via le réseau, il faut désigner un arbitre. Il s'agit en général d'une machine dédiée, le "serveur". Cela veut dire qu'aucun client ne peut prendre de décision sans en demander la permission au serveur, cela concerne en particulier les mouvements autorisés !

En pratique, cela veut dire que le "client" se transforme en simple terminal graphique:

  • Tous les événements claviers sont interprétés en tant que commande (aller à gauche, poser une bombe) et immédiatement envoyés au serveur
  • Tous les éléments d'affichage (mises à jour) sont envoyées par le serveur: déplacer tel joueur (y compris le client lui-même), déclencher une explosion, etc.

Enfin d'un point de vue technique, cela veut dire qu'en plus des événements clavier, il va falloir traiter un nouveau type d'événement - dit réseau - pour réagir dès que le serveur nous envoie des informations.

Notez que la communication est totalement asynchrone: les évenements de sortie (envoie d'action vers le serveur) et d'entrée (réception d'ordre du serveur) ont lieu de manière indépendante.

Programmation du protocole

Pour concevoir un protocole réseau, le plus simple est de se baser sur la façon d'un humain (comprendre "administrateur système"!) communique avec une machine. C'est à dire un ordre ou une information par ligne, en général en anglais et suffisamment explicite. Ainsi la programmation et le débogage se font naturellement.

En Perl, les accès au réseau se font comme avec un fichier, donc nous pourrons tout naturellement lire ou écrire une ligne à l'aide des fonctions et opérateurs habituels. Seul l'établissement de la connexion demandera un (petit) effort supplémentaire.

Plaçons nous du point de vue du client. Pour simplifier le débogage, chaque message (émis par le client ou reçu du serveur) sera affiché sur la console en le préfixant par C ou S pour déterminer son origine. Exemple (SERVER est le handle de la connexion):

sub send_server {
  my $msg = shift;
  print "C $msg\n";
  print SERVER "$msg\n";
}

sub receive_server {
  my $msg = <SERVER>;
}

}}}