Outils pour utilisateurs

Outils du site


nsi:tds:serveur_web20:serveur

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Warning: Undefined array key 2 in /home/goupillf/wiki.goupill.fr/lib/plugins/codeprettify/syntax/code.php on line 214

Module serveur

Avec les différents modules, le projet contient de quoi afficher quelques pages et nous allons le mettre en route en commençant par le module serveur.

Le projet contient le fichier serveur.py qui définit la classe Serveur.

Le module est commenté, lisez-le.

'''
Application serveur
  Utilise la bibliothèque socket pour écouter sur le port 80
  répond aux requêtes http du client
'''

from socket import socket, AF_INET, SOCK_STREAM

class Serveur:
    def __init__(self, routeur, port = 80):
        self.routeur = routeur
        self.port = port # port utilisé quand le navigateur d'un client demande une page via le service http

    def start(self):
        # mise en route de l'écoute sur le socket
        # s est l'objet socket gérant la connexion
        s = socket(AF_INET, SOCK_STREAM)
        s.bind(("", self.port))
        s.listen(5)

        print("Serveur Ok") # log sur le serveur

        while True:
            # le bloc try est utilisé pour permettre la détection
            # d'une pression sur la touche CTRL+C
            try:
                # récupération de la demande de connexion depuis le client
                # address est l'adresse du client faisant la requête
                # connexion contient les informations sur la requête
                connexion, address = s.accept()

                # Lecture de la requête elle-même sous forme de texte.
                # Si la requête est volumineuse, elle peut être récupérée en plusieurs fois
                # mais pour simplifier on considérera que la requête a un poids
                # toujours inférieur à 1024 octets
                # Notez que la requête a toujours une forme binaire, il faut
                # donc la convertir en caractères avec decode
                str_requete = connexion.recv(1024).decode('utf8')

                # Point A : Dans un premier temps, affichage brut de la requête
                print("Requête reçue :")
                print(str_requete)

                # il arrive parfois qu'une requête vide soit reçue. Il faut l'ignorer.
                if str_requete == "":
                    connexion.close()
                    continue

                # Permet d'interrompre le serveur
                # suffit d'écrire halt-serveur dans la requête
                if "halt-serveur" in str_requete:
                    break

                # Point B : Dans un premier temps, on se contente de répondre à la requête
                #   par le texte "ok"
                #   La réponse doit être sous forme binaire, on l'encode donc.
                reponse = "ok".encode("utf8")

                connexion.send(reponse)

                connexion.close()
            except KeyboardInterrupt: # capte une pression sur CTRL+C
                print("[CTRL+C] appuyé")
                # break provoque l'interruption de la boucle infinie while True.
                break

        print("Extinction du serveur")
        s.close()

Attention : quand le serveur est actif, il boucle de façon infinie avec while True. Pour pouvoir l'arrêter, il faut appuyer sur CTRL+C. Comme cela ne fonctionnera peut-être pas en Windows, vous pourrez aussi envoyer une requête contenant halt-serveur dans l'adresse.

Modifications

Le module serveur est déjà complet mais il faut modifier trois points :

  • L'initialisation du serveur va nécessiter la transmission d'un objet Routeur. Il faudra donc une initialisation __init__(routeur, port).
  • Le point A correspond à la réception de la requête client. Il faudra transformer cette requête au format texte en un objet Requete
  • Le point B correspond au traitement de la requête et au calcul de la réponse à envoyer au client.

Il faudra à la place utiliser l'objet Routeur pour analyser la requête, déclencher la fonction adaptée et obtenir la réponse.

nsi/tds/serveur_web20/serveur.txt · Dernière modification : de goupillwiki