Revenir au sommaire Tutoriaux

Comment réaliser un programme de jeu en réseau, en utilisant les composants ClientSocket et ServerSocket. par:
Christian GRUAIS
1. Principe
Le principe est d'utiliser les composants ClientSocket et ServerSocket. Une des joueurs sera le serveur, c'est lui qui contrôlera le jeu et synchronisera tous les joueurs, qui seront les clients. L'architecture réseau est la suivante. Les clients ne peuvent pas communiquer directement entre eux, tout passe par le serveur. (Ils peuvent cependant communiquer entre eux via le serveur.)
2. Etablir les connexions entres les joueurs
Il faut d'abord qu'un des joueurs lance le serveur. Pour cela, il doit ouvrir une socket serveur comme suit :
ServerSocket1.Port:=StrToInt(EditNumeroPort.Text);
ServerSocket1.Open;
.
Le numéro de port sera une valeur quelconque. Les seuls critères de choix sont les suivants :
· Le numéro de port ne doit pas être déjà utilisé, par un firewall, ou quelque soit d'autre.
· Le numéro de port devra impérativement être le même pour toutes les joueurs qui se connecteront ensemble.
.
La socket serveur étant lancée, il faut maintenant que les client s'y connectent, en ouvrant une socket client, pointant sur celle du serveur, comme suit :
ClientSocket1.Port:=StrToInt(EditNumeroPort.Text);
ClientSocket1.Host:=EditNomServeur.Text;
ClientSocket1.Open;
.
Le numéro de port sera celui sur lequel la socket serveur aura été ouverte.
Le nom du host sera l'adresse IP (Internet Protocole) du serveur hôte.On peut aussi utiliser le nom de la machine serveur, au moins en réseau local (on l'obtient, par exemple, en faisant un clic droit sur le poste de travail dans l'explorer).
.
3. Faire dialoguer les machines
Une fois que les connexions sont établies entres les différentes machines des différents joueurs, il s'agit de les faire dialoguer entre eux. Pour cela, on va utiliser les commandes suivantes :
.
En émission, pour une trame envoyée par le serveur à tous les clients :
For I:=0 To ServerSocket1.Socket.ActiveConnections -1 Do ServerSocket1.Socket.Connections[I].SendText('Salut les clients !');
.
En émission, pour une trame envoyée par le serveur à un client en particulier :
ServerSocket1.Socket.Connections[n° du client].SendText('Salut client !');
.
En émission, pour une trame envoyée par un client au serveur :
ClientSocket1.Socket.SendText('Salut serveur !');
..
En réception, pour une trame reçue par le serveur d'un client :
procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
begin
ShowMessage(Socket.ReceiveText);
end;
.
En réception, pour une trame reçue par le client du serveur :
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
ShowMessage(Socket.ReceiveText);
end;
.
Maintenant, on a les bases d'un programme de chat, qui fait dialoguer les postes entre eux. Bien évidemment, une trame transmise par un client ne sera reçu que par le serveur. Il faudra donc que le serveur redispatche la trame à tous les clients, si besoin est.
.
4. Jouer
Pour jouer, on va faire passer les ordres donnés au moteur du jeu, dans les sockets.
Pour tout cela, on va utiliser une structure de trame, qui va pouvoir se découper, par exemple, comme suit :
· Code de début de trame, ex : 'DEBUT'
· Code de type de trame, ex : 'BOUGER-PIECE'
· Contenu de la trame, ex : 'A3-B2'
· Code de fin de trame, ex : 'FIN'
.
Une codification de ce type va permettre de faire passer plusieurs types de trames dans les sockets. Chaque type de trame ayant son utilité propre. Par exemple :
· un type de trame qui transmet le nom des joueurs (plus convivial que les adresses IP ou les noms de machines),
· un type de trame qui permet l'initialisation de la position des pièces avant le début du jeu,
· un type de trame qui transmet les pièces bougées.
.
Les codes de débuts et de fin de trame ne sont pas obligatoires. Cependant, ils permettent de pratiquer des batteries de contrôles pour s'assurer de la validité des infos passés. Cela permet parfois d'éviter le blocage du jeu, parce que les plateaux de jeu des différents joueurs ne seraient plus à la même hauteur. De plus, l'utilisation d'un code de fin de trame, permet d'utiliser des trames de longueurs variables. Ce qui est très pratique, et indispensable si on ajoute un chat au jeu.
.
Souvent, après la phase de débugage, on remplacera, par exemple, 'BOUGER-PIECE' par 'Òœ„Þ¾ÌÛõ§÷ý'. Ceci, simplement pour que les codes de trames ne puissent plus être confondus avec le contenu d'un message de chat. Ce qui, là encore, bloquerai le jeu.

Revenir au sommaire Tutoriaux

Hit-Parade