Programmation réseau
Écrire un serveur et un client
1. Utilisation d’une socket TCP
TCP est l’acronyme de Transmission Control Protocol, soit protocole de contrôle de transmission et a été développé en 1973 et documenté au sein de la RFC 793. Il est situé dans le modèle OSI au sein de la couche transport et est répandu de par sa fiabilité.
Il se caractérise par la manière de mettre en place la synchronisation entre client et serveur et par le découpage en segments des octets à transmettre, chaque segment étant parfaitement identifiable et disposant d’un système de contrôle d’intégrité qui fait que celui qui reçoit un paquet peut savoir que le paquet est corrompu et le redemander.
Le flux TCP utilise les sockets et c’est le module éponyme de Python qui va nous permettre de travailler avec TCP.
L’idée ici est de réaliser un mini serveur de données clé-valeur très basique et le plus simple possible de manière à voir comment créer un serveur puis un client, mais aussi comment manipuler les données qui sont échangées de l’un à l’autre.
Ce qu’il faut absolument comprendre est que les données qui sont transmises d’un serveur à un client ou d’un client à un serveur sont des octets, et rien d’autre. En Python 2, cela pouvait prêter à confusion, puisque le type str de Python 2 était assimilable à des octets. Le type Python 3 str représente une chaîne de caractères en unicode et c’est le type bytes qui permet de gérer des octets.
Il faut donc particulièrement être attentif à ce point, puisque la plupart des exemples présents sur le net, par ailleurs d’excellentes qualités, sont écrits pour Python 2 et génèrent une confusion sur le type de données réellement envoyées.
On va créer un serveur qui s’attend à recevoir un nombre et qui renvoie un code en fonction du fait que ce nombre soit premier ou non.
Voici le code ce cette fonction :
def isprime(n):
'''check if integer n is a prime'''
#...
Utiliser un protocole standard
1. Client HTTP
L’idée ici est de s’adresser à un serveur, via le protocole HTTP et de récupérer des informations (page web ou autre).
Pour cela, il faut connaître le protocole HTTP afin de savoir de quelle manière s’adresser au serveur. Voici un exemple simple. On se connecte au serveur :
>>> conn = http.client.HTTPConnection('www.google.fr')
On utilise une des méthodes HTTP afin d’aller chercher les données souhaitées :
>>> conn.request("GET", "/search?hl=fr&q=python")
On récupère la réponse du serveur :
>>> response=conn.getresponse()
On vérifie que tout s’est bien passé et pour cela, il faut connaître les codes d’erreurs HTTP qui sont tous parfaitement expliqués dans la documentation officielle : http://docs.python.org/py3k/library/http.client.html
>>> print(response.status, response.reason)
200 OK
Comme tout s’est bien passé, il suffit de récupérer la page HTML renvoyée par le serveur :
>>> html=response.read()
Voyons à quoi cela peut ressembler :
>>> len(html)
85558
>>> html[:80]
b'<!doctype html><head><title>python - Recherche
Google</title><script>window.goog'
Il suffit maintenant de traiter le HTML pour en extraire les données que l’on souhaite et cela peut se faire aisément avec un parser tel que BeautifulSoup et un peu de recherche pour comprendre la structure de la page et être capable d’en tirer les bonnes informations.
Évidemment, une telle utilisation est archaïque lorsque l’on dispose de services web, mais il n’est parfois pas possible de faire autrement (site ancien ou payant).
L’écriture de tels scripts nécessite bien sûr une veille attentive pour déceler tout changement dans la structure de la page qui mettrait en péril la bonne lecture des données. Aussi est-il important selon le besoin de garder des sauvegardes des pages entières pour relancer un traitement correctif a posteriori.
La documentation officielle donne un exemple pour simuler le POST d’un formulaire.
Dans la dernière partie, nous créerons une application...
Wake-on-LAN
1. Prérequis
Wake-on-LAN est un standard réseau qui permet à un ordinateur éteint d’être démarré à distance.
Pour cela, ce matériel doit avoir une carte mère qui supporte le Wake-on-LAN et une carte réseau qui soit adaptée (actuellement, elles sont directement intégrées à la carte mère, mais sinon, il faut un connecteur supplémentaire).
Il faut également paramétrer le BIOS de l’ordinateur pour que celui-ci accepte les requêtes Wake-on-LAN, mais également le système d’exploitation (paramétrage de la carte réseau, relative à la gestion de l’alimentation).
Le fonctionnement du protocole implique que le routeur de réseau associe l’adresse MAC à une adresse IP. Sans quoi, il est nécessaire de réaliser du broadcast, ce que nous allons faire.
2. Mise en œuvre
Le principe du Wake-on-LAN est d’émettre sur le réseau un paquet magique qui, lorsque reçu par sa cible, la réveille.
La caractéristique magique de ce paquet est qu’il contient six fois FF, suivi de seize répétitions de l’adresse MAC de la cible à réveiller.
Voici sa construction :
>>> adresse_mac = b'C4:DF:12:58:4E:FC'
>>> paquet_magique = b'\xFF' * 6 + b''.join([int(i...