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:
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é.
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()
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"