Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
client-serveur_tcp_stream [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


client-serveur_tcp_stream

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
client-serveur_tcp_stream [2008/04/05 14:11]
tyrtamos
client-serveur_tcp_stream [2008/04/12 08:49]
tyrtamos
Ligne 1: Ligne 1:
-====== Client-Serveur TCP utilisant ======+====== Clients-serveurs TCP utilisant StreamRequestHandler du module SocketServer ======
    
-//**En construction**// 
- 
 ===== Généralités ===== ===== Généralités =====
  
 +Il s'agit d'une version d'un “client-serveur TCP” déjà élaboré, 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.
 +
 +Le principal avantage de cette version StreamRequestHandler par rapport à la version BaseRequestHandler est que les échanges sont traités comme un flux de fichier, ce qui permet de ne pas avoir à gérer soi-même de buffer.
 +
 +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…
 +
 +C'est encore un serveur très 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é.
 +
 +
 +\\
 ===== Le Serveur TCP en mode synchrone ===== ===== Le Serveur TCP en mode synchrone =====
  
 +Avec ce serveur synchrone, chaque requête doit attendre la fin de la requête précédente.
 +
 +Le code est largement auto-documenté: 
 +
 +\\
 <code python> <code python>
 #!/usr/bin/python #!/usr/bin/python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  
- Serveur TCP avec StreamRequestHandler +# Serveur TCP utilisant StreamRequestHandler du module SocketServer
-#  inspiré de: http://blog.doughellmann.com/2007/12/pymotw-socketserver.html+
  
 +# import nécessaire pour le fonctionnement du serveur
 import SocketServer import SocketServer
  
-# import seulement nécessaire pour le traitement d'erreur d'eval()+# import seulement nécessaire pour l'exemple (=calcul d'expression par eval())
 import sys import sys
 from math import * from math import *
 +
 +# initialisation des variables globales
 +adresse=('', 20000)
  
 ############################################################################## ##############################################################################
Ligne 43: Ligne 68:
 if __name__ == '__main__': if __name__ == '__main__':
  
-    adresse = ('192.168.0.99', 20000) 
     serveur = SocketServer.TCPServer(adresse, Traitementrequete)     serveur = SocketServer.TCPServer(adresse, Traitementrequete)
     print "serveur actif"     print "serveur actif"
     serveur.serve_forever()     serveur.serve_forever()
 +    # fermeture de connexion inutile: on arrête le serveur en "tuant" son processus
     #server.socket.close()     #server.socket.close()
- 
 </code> </code>
  
-===== Le Serveur TCP en mode asynchrone (threadé) =====+\\ 
 +===== Le Serveur TCP en mode asynchrone multi-threads ===== 
 + 
 +Avec ce serveur, chaque requête est traitée dans un nouveau thread sans attendre la fin de la requête précédente. 
 + 
 +Le code est largement auto-documenté: 
  
 +\\
 <code python> <code python>
 #!/usr/bin/python #!/usr/bin/python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  
- Serveur TCP avec StreamRequestHandler et ThreadingMixIn +# Serveur TCP utilisant StreamRequestHandler du module SocketServer
-#  inspiré de: http://blog.doughellmann.com/2007/12/pymotw-socketserver.html+
  
 +# import nécessaire pour le fonctionnement du serveur
 import SocketServer import SocketServer
  
-# import seulement nécessaire pour le traitement d'erreur d'eval()+# import seulement nécessaire pour l'exemple (=calcul d'expression par eval())
 import sys import sys
 from math import * from math import *
 +
 +# initialisation des variables globales
 +adresse=('', 20000)
  
 ############################################################################## ##############################################################################
Ligne 92: Ligne 125:
 if __name__ == '__main__': if __name__ == '__main__':
  
-    adresse = ('192.168.0.99', 20000) 
     serveur = Serveurthread(adresse, Traitementrequete)     serveur = Serveurthread(adresse, Traitementrequete)
     print "serveur actif"     print "serveur actif"
     serveur.serve_forever()     serveur.serve_forever()
 +    # fermeture de connexion inutile: on arrête le serveur en "tuant" son processus
     #server.socket.close()     #server.socket.close()
- 
 </code> </code>
  
-===== Le Serveur TCP en mode asynchrone (multiprocessus=====+\\ 
 +===== Le Serveur TCP en mode asynchrone multiprocessus =====
  
 +Avec ce serveur, chaque requête est traitée dans un nouveau processus sans attendre la fin de la requête précédente.
  
-===== Le Client TCP =====+Le code est largement auto-documenté: 
  
 +\\
 <code python> <code python>
 #!/usr/bin/python #!/usr/bin/python
 # -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
  
-client TCP fait pour communiquer avec un serveur TCP "StreamRequestHandler"+Serveur TCP utilisant StreamRequestHandler du module SocketServer
  
-Voir http://blog.doughellmann.com/2007/12/pymotw-socketserver.html+import nécessaire pour le fonctionnement du serveur 
 +import SocketServer
  
 +# import seulement nécessaire pour l'exemple (=calcul d'expression par eval())
 +import sys
 +from math import *
 +
 +# initialisation des variables globales
 +adresse=('', 20000)
 +
 +##############################################################################
 +class Traitementrequete(SocketServer.StreamRequestHandler):
 +
 +    def handle(self):
 +
 +        # lecture de la requête et suppression des caractères de fin de ligne
 +        requete = self.rfile.readline().rstrip('\r\n')
 +
 +        # préparation de la réponse
 +        try:
 +            reponse = "%s" % eval(requete)
 +        except:
 +            reponse = "%s" % sys.exc_info()[1]
 +
 +        # envoi de la réponse avec ajout des caractères de fin de ligne
 +        self.wfile.write("%s\r\n" % reponse)
 +
 +        return
 +
 +##############################################################################
 +class Serveurthread(SocketServer.ForkingMixIn, SocketServer.TCPServer):
 +    pass
 +
 +##############################################################################
 +if __name__ == '__main__':
 +
 +    serveur = Serveurthread(adresse, Traitementrequete)
 +    print "serveur actif"
 +    serveur.serve_forever()
 +    # fermeture de connexion inutile: on arrête le serveur en "tuant" son processus
 +    #server.socket.close()
 +</code>
 +
 +\\
 +===== Le Client TCP =====
 +
 +Vous adaptez l'adresse à votre situation!
 +
 +Le code est largement auto-documenté: 
 +
 +\\
 +<code python>
 +#!/usr/bin/python
 +# -*- coding: utf-8 -*-
 +
 +# client TCP fait pour communiquer avec un serveur TCP "StreamRequestHandler"
  
 import socket import socket
 +
 +buf=1024
 +adresse=('192.168.0.200', 20000)
  
 ############################################################################## ##############################################################################
 if __name__ == '__main__': if __name__ == '__main__':
  
-    adresse = ('192.168.0.99', 20000) 
     while True:     while True:
         # saisie de la requete au clavier         # saisie de la requete au clavier
Ligne 141: Ligne 232:
  
             # réception de la réponse             # réception de la réponse
-            reponse = maSocket.recv(1024).rstrip("\r\n")+            reponse = maSocket.recv(buf).rstrip("\r\n")
  
             # traitement de la réponse             # traitement de la réponse
-            print 'Reception: "%s"' % reponse+            print '=> "%s"' % reponse
  
             # arrêter la connexion             # arrêter la connexion
             maSocket.close()             maSocket.close()
- 
 </code> </code>
  
 +<html> 
 +<head> 
 +<style type="text/css"> 
 +<!-- 
 +body {background-image:url(fondcorps.jpg);
 +--> 
 +</style> 
 +</head> 
 +<body> 
 +</body> 
 +</html>
  
client-serveur_tcp_stream.txt · Dernière modification: 2008/04/12 08:49 de tyrtamos