Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Programmation > Python > La base des sockets en python > Lecture du tutoriel

La base des sockets en python

Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Avatar
Auteur : Geo.669
Note : 17 / 20 (8 votes)
Visualisations : 8 131

Plus d'informations Plus d'informations
De nos jours, la création des sockets dans un langage particulier devient de plus en plus facile, cela peut s'expliquer par :
- la simplicité du langage utilisé (ici, python)
- la notion de réseau (que nous allons aborder rapidement en premier).

Dans ce tutorial, nous allons apprendre à utiliser les sockets. Le but ? Savoir communiquer avec un serveur http distant. :)
Allons-y !
Sommaire du tutoriel :
Icône du chapitre

Les sockets, c'est quoi ?

Dans cette sous-partie, nous allons répondre précisément à la question indiquée dans le titre.
Alors c'est quoi les sockets, ça fonctionne comment ?

Les sockets, en informatique, ce sont tout simplement des objets familiers dans la communication. Ils peuvent être utilisés pour communiquer en local ou sur internet.

Votre ordinateur, sur le net, est identifié par ce qu'on appelle une adresse IP. IP signifie Internet Protocol.
Elle se présente sous la forme : xx.xx.xx.xx, xx étant un nombre de 0 à 255.
Exemple d'adresse IP : 81.220.41.212.
Le protocole TCP/IP utilise des adresses IP (donc on est identifié par une adresse) pour identifier un élément dans un réseau comme internet.

Votre ordinateur communique par l'intermédiare de ports. L'adresse IP sert à identifier l'ordinateur sur le réseau et le port à identifier l'application dans l'ordinateur (sur un serveur web, il s'agit d'Apache. :) ).
Le principe de l'utilisation des ports peut se résumer comme tel:
- En réalité, j'ouvre cette porte, je dis à mon frère de passer à table
- En python, je me connecte sur tel port et j'envoie mes données à mon frère qui lui aussi est sur l'écoute de ce même port.
Si le port est fermé, ça ne marchera évidemment pas. :p

Il existe des applications connues qui utilisent différents ports, exemples :
- le protocole IRC, qui utilise le port 6667 ou 7000 pour une connexion sécurisée,
- le protocole FTP, qui utilise le port 21.
- le protocole HTTP, qui occupe le port 80. Si vous avez un serveur web sur votre ordinateur, il occupe automatiquement ce port.

Il existe en tout 65535 ports (oui, c'est beaucoup :p ).

En résumé :
- On créé notre socket
- On se connecte à un serveur, par son adresse IP ou bien son nom de domaine en choisissant un port.
- Le serveur web, configuré pour être à l'écoute, va recevoir nos requêtes et va les traiter. :)

Maintenant, on passe à la partie programmation (qui est déjà plus intéressante !).

Envoyer une requête à un serveur web

Enfin, nous y voila. Attaquons le plat de résistance.
Dans cette partie, nous allons apprendre à faire un script qui envoie simplement une requête HTTP à un serveur web.
Cependant je vous mets en garde sur le fait qu'il vous faut les bases en python. Si ce n'est pas le cas, je vous recommande le superbe tutorial rédigé par la communauté pythonienne.
Aller sur le tutorial "Apprenons Python !"

Bien, pour commencer notre script, il faut importer ce qu'on appelle un module. Ce module contient toutes les fonctions nécéssaires à l'utilisation de socket.
Code : Python
1
import socket # on importe le module dans notre script


Maintenant, nous pouvons programmer en toute tranquillité. Nous allons commencer par créer une socket :
Code : Python
1
MaSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)


Comme vous pouvez le constater, j'ai créer une socket qui s'appellera "MaSocket". Je lui assigne une valeur un peu tordue. vous pouvez constater qu'à l'aide de la coloration synthaxique de code, le premier mot socket est coloré, il correspond en fait au module, qui représente une classe nommée socket. La fonction socket, elle, permet de créer une socket.
Elle contient deux arguments :
- AF_INET, c'est la famille du socket (vous n'avez pas à vous en soucier, contentez vous simplement de laisser ce paramètre tel quel).
- SOCK_STREAM : le type de socket. Ce type permet simplement de communiquer entre deux ordinateurs.

Maintenant que notre socket est créée, nous allons lui demander de se connecter à un serveur web. Pourquoi pas... le site du zéro ? :-°

Code : Python
1
MaSocket.connect(("www.siteduzero.com",80))

Ici, je demande à me connecter sur le serveur du site du zéro, sur le port 80. Notez qu'il y a deux parenthèses, car la fonction connect() reçoit en argument deux arguments eux-mêmes mis entre parenthèse :
- le nom du serveur (peut très bien être une adresse IP !)
- le numéro du port.

Voila, nous sommes connectés !
Maintenant, nous allons préparer notre requête HTTP à envoyer :
Code : Python
1
2
3
query = "GET / HTTP/1.1\r\n"
query+= "Host: www.siteduzero.com\r\n"
query+= "Connection: close\r\n\r\n"


Ceci est une requête HTTP. Bien évidemment je ne vais pas vous faire des cours là-dessus. Si vous voulez en savoir plus, voici un lien utile :
http://www.commentcamarche.net/internet/http.php3

Maintenant qu'on a préparé notre requête, on l'envoie au serveur :
Code : Python
1
MaSocket.send(query)


Et on récupère la réponse en l'affichant :
Code : Python
1
2
response = MaSocket.recv(1024)
print response

Ici, 1024 indique le nombre d'octets à récupérer dans la réponse.

Je vais récapituler avec un code qui envoie une requête et récupère les 15 premiers octets de la réponse.

Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import socket # on importe le module, TRES IMPORTANT !

#creation de la socket puis connexion
s       = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("www.google.fr",80))

# preparation de la requete
Request = "GET / HTTP/1.1\r\n"
Request+= "Host: www.google.fr\r\n"
Request+= "Connection: Close\r\n\r\n"

# envoi puis reception de la reponse
s.send(Request)
data = s.recv(15)
print data # on affiche la reponse


Ce script produit le resultat suivant :
Code : Console
HTTP/1.0 200 OK


Cette unique ligne nous informe simplement que la requête à bien été comprise par le serveur, et ce serveur existe bien (reportez vous au lien que je vous ai donné ci-dessus sur le protocole HTTP pour en savoir plus).

C'est tout ! :)

Faire communiquer un client et un serveur

Et bien maintenant, voici le déssert (la partie que nous préférons, comme on dit... :p ).
Dans cette sous partie, nous allons apprendre à faire :
- Un client qui envoie des messages au serveur
- Un serveur qui reçoit et affiche les messages reçus.

Commençons par le serveur. Tout d'abord, il faut importer le module des sockets, c'est très important.
Synthaxe (rappel) :
Code : Python
1
import socket # importation du module


Pour la suite, nous allons écrire du code différent (bah quoi, un serveur se comporte différement d'un client). Un serveur, ça fonctionne comme ceci :
"Je me mets à l'écoute sur tel port et je reçois les données. Si j'en ai envie, je réponds au client. :-° ".

En premier, nous allons commencer par créer notre socket (comme toujours :D ).
Code : Python
1
Sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)


Puisque nous codons un serveur, il faut binder ce socket, c'est-à-dire qu'il doit être apte à recevoir des connexions :
Code : Python
1
2
3
4
5
Host = '127.0.0.1' # l'ip locale de l'ordinateur
Port = 234         # choix d'un port 

# on bind notre socket :
Sock.bind((Host,Port))


Voila, notre serveur est créé, mais il est bien inopérant :( . Il faut arranger cela.
Tu nous réserves quoi pour la suite ?

Pour la suite, nous allons faire en sorte que le serveur soit à l'écoute et accepte une unique connexion. (Je vous rappelle que ce tuto énumère la base des sockets :) ).

Code : Python
1
2
3
4
5
6
# On est a l'ecoute d'une seule et unique connexion :
Sock.listen(1)

# Le script se stoppe ici jusqu'a ce qu'il y ait connexion :
client, adresse = s.accept() # accepte les connexions de l'exterieur
print "L'adresse",adresse,"vient de se connecter au serveur !"


Voila, on y est presque, il nous reste une seule et unique chose à faire : afficher les données reçues !
Pour cela, il nous faut faire une boucle infinie pour recevoir les données :
Code : Python
1
2
3
4
5
while 1:
        RequeteDuClient = client.recv(255) # on reçoit 255 caracteres grand max
        if not RequeteDuClient: # si on ne recoit plus rien
                break  # on break la boucle (sinon les bips vont se repeter)
        print RequeteDuClient,"\a"         # affiche les donnees envoyees, suivi d'un bip sonore


Et pour terminer, on ferme la connexion :
Code : Python
1
client.close() # ferme la connexion avec le client


Voici le code complet du serveur prêt à être sur l'écoute du port 234 :
Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import socket
Sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
Host = '127.0.0.1' # l'ip locale de l'ordinateur
Port = 234         # choix d'un port

# on bind notre socket :
Sock.bind((Host,Port))

# On est a l'ecoute d'une seule et unique connexion :
Sock.listen(1)

# Le script se stoppe ici jusqu'a ce qu'il y ait connexion :
client, adresse = Sock.accept() # accepte les connexions de l'exterieur
print "L'adresse",adresse,"vient de se connecter au serveur !"
while 1:
        RequeteDuClient = client.recv(255) # on recoit 255 caracteres grand max
        if not RequeteDuClient: # si on ne recoit plus rien
                break  # on break la boucle (sinon les bips vont se repeter)
        print RequeteDuClient,"\a"         # affiche les donnees envoyees, suivi d'un bip sonore


Maintenant, on attaque la programmation côté client :pirate:

Le client, c'est très simple à réaliser, sachant qu'on a étudié un cas dans la sous partie précédente de ce tutorial. Je vais donc écrire le code d'un coup, en le commentant du mieux que je puisse faire. :)

Code : Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import socket # on importe le module
Sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # on cree notre socket

# definition des informations :
Host = '127.0.0.1'
Port = 234

# on se connecte sur le serveur avec les informations ci-dessus
# assurez-vous d'avoir mis en marche le serveur !
Sock.connect((Host,Port))

# On est connecte, on fait une boucle infinie d'inputs pour l'envoi des messages :
while 1:
        msg = raw_input('>> ')  # on rentre des donnees
        Sock.send(msg) # on envoie ces donnees

# regardez ce qui se passe du cote serveur.


Vous n'êtes pas tenté de tester vous même ? Et bien regardez le résultat côté serveur :
Code : Console
C:\Documents and Settings\utilisateur\Bureau>C:\Python24\python serveur.py

L'adresse ('127.0.0.1', 2852) vient de se connecter au serveur !

Yo !

Comment va ?

Geo est trop sympa, il nous a fait un tuto sur les sockets en python !

Enfin voila, @++


Il y a 20 secondes, j'avais lancé le client :
Code : Console
>> Yo !

>> Comment va ?

>> Geo est trop sympa, il nous a fait un tuto sur les sockets en python !

>> Enfin voila, @++


Si tout va bien, le serveur se ferme en même temps que le client, car lorsqu'on interrompt le script à l'aide de ctrl + c, on envoie un paquet vide au serveur, et le serveur "break" sa boucle infinie dans une telle condition.

Je pense avoir tout dit, le tutorial touche désormais à sa fin. :)

Le tutorial est terminé.
Qu'avons nous appris ?

Nous savons désormais communiquer avec un serveur web tout en lui envoyant ce qu'on appelle des requêtes HTTP. Celui-ci, intelligent comme il est, sait les traiter et les comprendre.

Pour ceux qui veulent aller plus loin :
http://wikipython.flibuste.net/moin.py/CodesReseau : un bon lien sur la programmation réseau en python
http://www.progx.org/index.php?section [...] hon/article13

C'est tout, à la revoyure. :)
Retour en haut Retour en haut


Créé : le 09/03/2007 à 09:04:48
Modifié : le 22/08/2008 à 16:09:12
Avancement : 100%
Licence : Copie non autorisée

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 172 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.1481s (0.1352s)