Serveur web

Ph.Leroy

2015-05-01

La mise en œuvre d'un serveur ethernet avec le protocole TCP/IP à partir de Sisal est vraiment très simple. Ce serveur permet de communiquer avec tout autre script Sisal mais aussi tout autre programme de tout autre machine capable d'établir une connexion ethernet TCP/IP.

Le serveur Tcp

Le serveur de connexion ethernet est par définition le programme qui est en attente de connexion sur un port donné, par exemple un serveur http attend sur le port 80, par défaut le protocole Sisal utilise le port 1550 (pourquoi pas celui-là).

Grosso-modo les ports inférieurs à 2048 sont réservés à des applications biens connues (FTP, HTTP, NNTP, ...) mais on dispose de tout le reste jusqu'à 32767.

Par exemple ici on crée un serveur nommé Tcps à l'écoute sur le port 8192 avec six connexions simultanées au maximum.

Object
 Tcps TcpServer, 8192, 6;  // port 8192 and 6 connections simultaneaously

Lorsqu'un client essaye de se connecter, le serveur Tcps lève un événement Connect et met à jour la liste de connexions en attente Connected. Le serveur accepte ou refuse chaque connexion avec la fonction Accept.

   On Tcps.Connect do
   for tcp in Tcps.Connected do 
      Tcps.Accept( tcp, 1); // Accept every connection

Une fois la connexion acceptée, chaque fois qu'un ou plusieurs clients envoient une trame le serveur Tcps lève un événement et une liste de réception.

Ici chaque fois qu'un client demande l'heure ( mot-clé TIME), le serveur lui renvoie l'heure courante.

   On Tcps.Receive do
   for tcp in tcps.received do begin
      Tcps.Get( tcp, trame);
      if trame == "TIME" then Tcps.Send( tcp, Now());
    end

Une fois qu'un client en a fini il se déconnecte ; le serveur Tcps lève alors un événement de déconnexion et une liste de déconnexion.

On Tcps.Disconnect do
   for tcp in Tcps.Disconnected do 
      Tcps.Close( tcp); 

Le client Tcp

Du coté du client c'est encore plus simple; chaque fois qu'un client a besoin de communiquer avec un serveur qu'il soit Sisal ou autre il doit déclarer un objet TcpClient précisant l'adresse Tcp/Ip du serveur et le port de connexion.

Clt TcpClient, "localhost", 8192, 60; // Server name, port and delay for automatic reconnect

Et par exemple toutes les dix secondes on va demander l'heure au serveur.

On Horloge.ToutesLesDixSecondes do
if Clt.Status() == 1 then Clt.Send( "TIME");

et chaque fois que l'on reçoit une réponse du serveur on a un événement Receive.

On Clt.Receive do
Clt.Get( Trame);

Voila c'est tout.