Programmation Python/Réseau
Communication entre programmes.
Le développement extraordinaire de l'internet a amplement démontré que les ordinateurs peuvent être des outils de communication très efficaces. Dans ce chapitre, nous allons expérimenter la plus simple des techniques d'interconnexion de deux programmes, qui leur permette de s'échanger des informations par l'intermédiaire d'un réseau.
Pour ce qui va suivre, nous supposerons donc que vous collaborez avec un ou plusieurs de vos condisciples, et que vos postes de travail Python sont connectés à un réseau local dont les communications utilisent le protocole TCP/IP. Le système d'exploitation n'a pas d'importance : vous pouvez par exemple installer l'un des scripts Python décrits ci-après sur un poste de travail fonctionnant sous Linux, et le faire dialoguer avec un autre script mis en œuvre sur un poste de travail confié aux bons soins d'un système d'exploitation différent, tel que MacOS ou Windows.
Vous pouvez également expérimenter ce qui suit sur une seule et même machine, en mettant les différents scripts en œuvre dans des fenêtres indépendantes.
Les sockets.
Le premier exercice qui va vous être proposé consistera à établir une communication entre deux machines seulement. L'une et l'autre pourront s'échanger des messages à tour de rôle, mais vous constaterez cependant que leurs configurations ne sont pas symétriques. Le script installé sur l'une de ces machines jouera en effet le rôle d'un logiciel serveur, alors que l'autre se comportera comme un logiciel "client".
Le logiciel serveur fonctionne en continu, sur une machine dont l'identité est bien définie sur le réseau grâce à une "adresse" IP spécifique. Il guette en permanence l'arrivée de requêtes expédiées par les clients potentiels en direction de cette adresse, par l'intermédiaire d'un "port de communication" bien déterminé. Pour ce faire, le script correspondant doit mettre en œuvre un objet logiciel associé à ce port, que l'on appelle un socket.
Au départ d'une autre machine, le logiciel client tente d'établir la connexion en émettant une requête appropriée. Cette requête est un message qui est confié au réseau, un peu comme on confie une lettre à la Poste. Le réseau pourrait en effet acheminer la requête vers n'importe quelle autre machine, mais une seule est visée : pour que la destination visée puisse être atteinte, la requête contient dans son en-tête l'indication de l'adresse IP et du port de communication destinataires.
Lorsque la connexion est établie avec le serveur, le client lui assigne lui-même l'un de ses propres ports de communication. À partir de ce moment, on peut considérer qu'un canal privilégié relie les deux machines, comme si on les avait connectées l'une à l'autre par l'intermédiaire d'un fil (les deux ports de communication respectifs jouant le rôle des deux extrémités de ce fil). L'échange d'informations proprement dit peut commencer.
Pour pouvoir utiliser les ports de communication réseau, les programmes font appel à un ensemble de procédures et de fonctions du système d'exploitation, par l'intermédiaire d'objets interfaces que l'on appelle des sockets. Ceux-ci peuvent mettre en œuvre deux techniques de communication différentes et complémentaires : celle des paquets (que l'on appelle aussi des datagrammes), très largement utilisée sur l'internet, et celle de la connexion continue, ou "stream socket", qui est un peu plus simple.
Construction d'un serveur élémentaire.
Pour nos premières expériences, nous allons utiliser la technique des stream sockets.
Celle-ci est en effet parfaitement appropriée lorsqu'il s'agit de faire communiquer des ordinateurs interconnectés par l'intermédiaire d'un réseau local. C'est une technique particulièrement aisée à mettre en œuvre, et elle permet un débit élevé pour l'échange de données.
L'autre technologie (celle des paquets) serait préférable pour les communications expédiées via l'internet, en raison de sa plus grande fiabilité (les mêmes paquets peuvent atteindre leur destination par différents chemins, être émis ou ré-émis en plusieurs exemplaires si cela se révèle nécessaire pour corriger les erreurs de transmission), mais sa mise en œuvre est un peu plus complexe. Nous ne l'étudierons pas dans ce cours.
Le script ci-dessous met en place un serveur capable de communiquer avec un seul client :
import socket, sys
HOST = '192.168.14.152'
PORT = 50000
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
 mySocket.bind((HOST, PORT))
except socket.error:
 print "La liaison du socket à l'adresse choisie a échoué."
 sys.exit()
while 1:
 # 3) Attente de la requête de connexion d'un client :
 print "Serveur prêt, en attente de requêtes ..."
 mySocket.listen(5)
 # 4) Etablissement de la connexion :
 connexion, adresse = mySocket.accept()
 print "Client connecté, adresse IP %s, port %s" % (adresse[0], adresse[1])
 # 5) Dialogue avec le client :
 connexion.send("Vous êtes connecté au serveur Marcel. Envoyez vos messages.")
 msgClient = connexion.recv(1024)
 while 1:
 print "C>", msgClient
 if msgClient.upper() == "FIN" or msgClient =="":
 break
 msgServeur = raw_input("S> ")
 connexion.send(msgServeur)
 msgClient = connexion.recv(1024)
 # 6) Fermeture de la connexion :
 connexion.send("Au revoir !")
 print "Connexion interrompue."
 connexion.close()
 ch = raw_input("<R>ecommencer <T>erminer ? ")
 if ch.upper() =='T':
 break
Construction d'un client rudimentaire.
Le script ci-dessous définit un logiciel client complémentaire du serveur décrit dans les pages précédentes. On notera sa grande simplicité.
import socket, sys
HOST = '192.168.14.152'
PORT = 50000
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
 mySocket.connect((HOST, PORT))
except socket.error:
 print "La connexion a échoué."
 sys.exit() 
print "Connexion établie avec le serveur." 
msgServeur = mySocket.recv(1024)
while 1:
 if msgServeur.upper() == "FIN" or msgServeur =="":
 break
 print "S>", msgServeur
 msgClient = raw_input("C> ")
 mySocket.send(msgClient)
 msgServeur = mySocket.recv(1024)
print "Connexion interrompue."
mySocket.close()
Récupérer une page Web en python.
Python intègre le module httplib qui permet d'émettre et de recevoir des requêtes HTTP.
Afficher une page Web.
Le code suivant (src) permet de récupérer, à l'aide d'une requête HTTP, une page Web et affiche son code source à l'écran.

Sécurité des systèmes informatiques/Sécurité informatique/Introduction