Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente | Dernière révision Les deux révisions suivantes | ||
client-serveur_tcp_stream [2008/04/05 14:11] tyrtamos |
client-serveur_tcp_stream [2008/04/05 17:28] tyrtamos |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== | + | ====== |
- | //**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' | ||
+ | |||
+ | 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' | ||
+ | |||
+ | * on arrête le serveur seulement en “tuant” son processus. | ||
+ | |||
+ | Pour éviter d' | ||
+ | |||
+ | 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> | ||
# | # | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
- | # Serveur TCP avec StreamRequestHandler | + | # Serveur TCP utilisant |
- | # inspiré de: http:// | + | |
+ | # import nécessaire pour le fonctionnement du serveur | ||
import SocketServer | import SocketServer | ||
- | # import seulement nécessaire pour le traitement d'erreur | + | # import seulement nécessaire pour l'exemple (=calcul |
import sys | import sys | ||
from math import * | from math import * | ||
+ | |||
+ | # initialisation des variables globales | ||
+ | adresse=('', | ||
############################################################################## | ############################################################################## | ||
Ligne 43: | Ligne 68: | ||
if __name__ == ' | if __name__ == ' | ||
- | adresse = (' | ||
serveur = SocketServer.TCPServer(adresse, | serveur = SocketServer.TCPServer(adresse, | ||
print " | print " | ||
serveur.serve_forever() | serveur.serve_forever() | ||
+ | # fermeture de connexion inutile: on arrête le serveur en " | ||
# | # | ||
- | |||
</ | </ | ||
- | ===== Le Serveur TCP en mode asynchrone | + | \\ |
+ | ===== Le Serveur TCP en mode asynchrone | ||
+ | |||
+ | 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> | ||
# | # | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
- | # Serveur TCP avec StreamRequestHandler | + | # Serveur TCP utilisant |
- | # inspiré de: http:// | + | |
+ | # import nécessaire pour le fonctionnement du serveur | ||
import SocketServer | import SocketServer | ||
- | # import seulement nécessaire pour le traitement d'erreur | + | # import seulement nécessaire pour l'exemple (=calcul |
import sys | import sys | ||
from math import * | from math import * | ||
+ | |||
+ | # initialisation des variables globales | ||
+ | adresse=('', | ||
############################################################################## | ############################################################################## | ||
Ligne 92: | Ligne 125: | ||
if __name__ == ' | if __name__ == ' | ||
- | adresse = (' | ||
serveur = Serveurthread(adresse, | serveur = Serveurthread(adresse, | ||
print " | print " | ||
serveur.serve_forever() | serveur.serve_forever() | ||
+ | # fermeture de connexion inutile: on arrête le serveur en " | ||
# | # | ||
- | |||
</ | </ | ||
- | ===== Le Serveur TCP en mode asynchrone | + | \\ |
+ | ===== 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> | ||
# | # | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
- | # client | + | # Serveur |
- | # Voir http:// | + | # import nécessaire pour le fonctionnement du serveur |
+ | import SocketServer | ||
+ | # import seulement nécessaire pour l' | ||
+ | import sys | ||
+ | from math import * | ||
+ | |||
+ | # initialisation des variables globales | ||
+ | adresse=('', | ||
+ | |||
+ | ############################################################################## | ||
+ | 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(' | ||
+ | |||
+ | # préparation de la réponse | ||
+ | try: | ||
+ | reponse = " | ||
+ | except: | ||
+ | reponse = " | ||
+ | |||
+ | # envoi de la réponse avec ajout des caractères de fin de ligne | ||
+ | self.wfile.write(" | ||
+ | |||
+ | return | ||
+ | |||
+ | ############################################################################## | ||
+ | class Serveurthread(SocketServer.ForkingMixIn, | ||
+ | pass | ||
+ | |||
+ | ############################################################################## | ||
+ | if __name__ == ' | ||
+ | |||
+ | serveur = Serveurthread(adresse, | ||
+ | print " | ||
+ | serveur.serve_forever() | ||
+ | # fermeture de connexion inutile: on arrête le serveur en " | ||
+ | # | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | ===== Le Client TCP ===== | ||
+ | |||
+ | Vous adaptez l' | ||
+ | |||
+ | Le code est largement auto-documenté: | ||
+ | |||
+ | \\ | ||
+ | <code python> | ||
+ | # | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | # client TCP fait pour communiquer avec un serveur TCP " | ||
import socket | import socket | ||
+ | |||
+ | buf=1024 | ||
+ | adresse=(' | ||
############################################################################## | ############################################################################## | ||
if __name__ == ' | if __name__ == ' | ||
- | adresse = (' | ||
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(" | + | reponse = maSocket.recv(buf).rstrip(" |
# traitement de la réponse | # traitement de la réponse | ||
- | print 'Reception: | + | print '=> " |
# arrêter la connexion | # arrêter la connexion | ||
maSocket.close() | maSocket.close() | ||
- | |||
</ | </ | ||