Outils pour utilisateurs

Outils du site


client-serveur_tcp_mini

Client-Serveur TCP minimum utilisant seulement le module "socket"

Généralités

Il s'agit de la version la plus simple d'un “client-serveur TCP” pouvant être utilisé sur une même machine ou dans un réseau local TCP/IP sur plusieurs machines différentes.

Attention: le protocole réseau est TCP/IP, le même qu'Internet, mais ce n'est pas du “web”: un navigateur web ne sera pas un “client” correct.

Remarques:

  • il ne faut pas mélanger le serveur et le client dans la même page de code comme on le voit souvent dans les exemples sur le web.
  • il faut lancer l'exécution du serveur directement en console et pas avec un outil de développement.
  • on arrête le serveur seulement en “tuant” son processus.

Pour éviter d'avoir un exemple où on se contente de renvoyer la requête au demandeur, ce qui manque un peu d'intérêt, on donne ici l'exemple d'une mini calculatrice d'expressions mathématiques en utilisant eval(). Au moins, ça, c'est utile…

Vous aurez du mal à trouver un serveur plus simple… Par contre, je ne sais pas ce que ça donne sur le plan sécurité réseau: à utiliser dans un réseau local protégé.


1- Le serveur TCP synchrone

C'est un serveur synchrone, c'est à dire que chaque requête doit attendre la fin du traitement de la requête précédente

Le code est largement auto-documenté:


#!/usr/bin/python
# -*- coding: utf-8 -*-
 
# import nécessaire au fonctionnement du serveur
import socket
 
# imports seulement nécessaires à l'exemple (=calcul d'expression par eval())
import sys
from math import *
 
buf=1024
adresse=('',20000)
 
socketserveur=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketserveur.bind(adresse)
socketserveur.listen(5)  # 5 connexions acceptées seulement
print "serveur actif"
 
# boucle de service du serveur
while True:
    # attente d'une nouvelle connexion et enregistrement du demandeur
    socketclient, adresseclient = socketserveur.accept()
 
    # lecture de la requête
    requete = socketclient.recv(buf).strip()
 
    # préparation de la réponse
    try:
        reponse = "%s" % eval(requete)
    except:
        reponse = "%s" % sys.exc_info()[1]
 
    # envoi de la réponse au demandeur
    socketclient.send("%s" % reponse)
 
    # fermeture de la connexion client
    socketclient.close()
 
# fermeture de la connexion serveur inutile ici,
#   puisque pour arrêter ce serveur, il faut "tuer" son processus
#socketserveur.close()


2- Le client TCP

Vous adaptez l'adresse à votre situation!

Le code est largement auto-documenté:


#!/usr/bin/python
# -*- coding: utf-8 -*-
 
import socket
 
buf=1024
adresse=('192.168.0.99',20000)
 
##############################################################################
if __name__ == '__main__':
 
    while True:
 
        # saisie de la requête au clavier et suppression des espaces des 2 côtés
        requete = raw_input('?: ').strip()
 
        # test d'arrêt
        if requete=="":
            monSocket.close()
            break
 
        # Etablissement de la connexion avec le serveur
        monSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        monSocket.connect(adresse)
 
        # envoi de la requête au serveur
        envoi = monSocket.send("%s" % requete)
 
        # réception de la réponse
        reponse = monSocket.recv(buf)
        print "=> %s" % reponse
 
        # fermeture de la connexion à la fin de chaque requete-réponse
        monSocket.close()
    print "fin du client TCP"

client-serveur_tcp_mini.txt · Dernière modification: 2008/04/12 08:48 de tyrtamos

Outils de la page