wiki:InsiaProgPerlProjetBomberStep3

Version 7 (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.

Nous utiliserons le protocole TCP, celui-ci se prêtant bien à une utilisation en LAN où les conditions sont en générales bonnes (congestion, RTT). L'utilisation d'UDP est plus complexe car il faut programmer une logique d'arbitration plus complexe prenant en compte le séquencement arbitraire et la non-vérification d'arrivée des paquets. Ceci n'est en général souhaitable que pour les jeux où l'arbitration demande une forte précision temporelle (shoot them'up).

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 = new IO::Socket::INET(...);

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

sub receive_server {
  my $msg = <SERVER>;
  if (defined $msg) {
    chomp $msg;
    print "S $msg\n";
  }
  return $msg;
}

Note: la méthode de lecture est dite en mode polling, c'est-à-dire qu'elle peut ne rien renvoyer (cad. qu'il n'y a pas de message reçu et non traité). Ce cas est représenté par le retour d'une valeur indéfinie (undef).

Description du protocole