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
